“Uncaught ReferenceError: graphique n'est pas défini”

tous,

Je travaille avec la suite de HTML/Javascript code:

<!doctype html>
<html>
<head>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<!-- google fonts from CDN -->
<link href='http://fonts.googleapis.com/css?family=Open+Sans:400,300,600' rel='stylesheet' type='text/css'>
<!-- highcharts -->
<script src="http://code.highcharts.com/highcharts.js"></script>
<style>
html, body {
width: 95%;
margin: auto;
font-family: 'Open Sans',sans-serif;
}
#chart_container {
width:100%;
height:500px;
}
</style>
</head>
<body>
<h1>Live Data</h1>
<div id="chart_container">
</div>
</body>
<script type="text/javascript">
$(document).ready(function() {
chart = new Highcharts.Chart({
chart: {
renderTo: 'chart_container',
defaultSeriesType: 'line',
events: {
load: getBirds
}
},
title: {
text: 'DRHW Live Data Stream'
},
xAxis: {
type: 'datetime',
tickPixelInterval: 150,
maxZoom: 20 * 1000
},
yAxis: {
title: {
text: 'Count Observed'
}
},
series: [
],
legend: {
layout: 'horiztonal',
align: 'center'
}
});
function getBirds() {
var now = new Date();
var et = now.getTime() / 1000; //PHP TS
var st = et - 10; //30 seconds prior in PHP
console.log(chart);
if (chart.series.length > 0) {
var series = chart.series[0];
var length = series.length + 1;
var shift = series.data.length > 20;
}
$.getJSON("https://path/to/json&callback=?", function(result) {
var data = result.data;if (data.length == 0) {
return;
} else {
additions = new Array();
for (i=0;i<data.length;i++) {
if (data[i].qstype != "1") {
species = data[i].answers[0]['answer'];
scode = species.substring(0,species.search(" - ")).trim()
count = (data[i].answers[1]['answer'] * 1);
newdata = new Object();
newdata['name'] = species;
newdata['count'] = count;
additions.push(newdata);
}
}
//now, for each addition, you need to loop through the existing data structures, and see if the thing exists.  if it does, add the data; if not, add the thing, then add the data.
var existingdata = chart.series;
for (i=0;i<additions.length;i++) {
isnewpoint = true;
for (j=0;j<existingdata.length;j++) {
if (existingdata[j].name == additions[i].name) {
isnewpoint = false
count = additions[i].count;
point = [now.getTime(),count];
chart.series[j].addPoint(point, true, shift);
shift = false; //this way, only one shift occurs - the first time through adding a new point to an existing data set. this will control against future shifting, either from other datapoints having new points added, 
}
}
if (isnewpoint) {
newseries = new Object();
count = additions[i].count;
newseries['name'] = additions[i].name;
for (j=0;j<length;j++) {
newseries['data'].push(0);
}
newseries['data'].push(count);
chart.series.push(newseries);
}
}
//we have now looped through and added a new data point to all species where new data was created in this pull.  We still need to add a new point to those that were not affected.
existingdata = chart.series;
for (i=0;i<existingdata.length;i++) {
getname = existingdata[i].name;
getlength = existingdata[i].data.length;
if (getlength<length) { //which we established earlier as one MORE than existed previously, prior to the addition
point = [now.getTime(),0]
chart.series[i].addPoint(point, true, shift);
}
}
}
setTimeout(getBirds,10000);
});
}
});
</script>
</html>

Le problème que je vais avoir, c'est assez simple (mais me rend fou!), et dès le début du js bloc. Si je suis la définition de la variable "tableau" comme la nouvelle Highcharts graphique, et je me suis mise en "getBirds" comme la fonction de charge une fois que c'est chargé, le console.ligne de journal me dit que le tableau n'est pas défini, et la ligne en dessous, il renvoie une erreur (Uncaught TypeError: Cannot read property 'series' of undefined).

J'ai vérifié les éléments suivants:

  1. La Highcharts de référence (http://www.highcharts.com/docs/working-with-data/preprocessing-live-data), ce qui suggère une configuration similaire à la mienne;
  2. J'ai essayé de définir la chart variable sur sa propre ligne, qui, bien sûr définit graphique pour ma console.journal, mais ne définit pas la chart.series requis sur la ligne suivante);
  3. J'ai fait des recherches stackoverflow et d'autres documents pour la portée des variables, mais je pense que je suis le manipuler correctement basé sur mes recherches.
  4. J'ai essayé d'inverser l'ordre - mettre le getBirds() fonction au-dessus de la chart définition.

Je suis à une perte. Toute aide est grandement appréciée, merci d'avance!

Pourquoi avez-vous---> $(function() { $(document).ready(function() {
Oui, OP, $(function(){}) et $(document).ready(function(){}) sont la même chose.
Concernant votre question, si le chart.events.load gestionnaire est d'attendre jusqu'à ce que le DOM est prêt, alors pourquoi l'utiliser? Vous êtes déjà ce que (deux fois).
Je ne pense pas que j'avais besoin des deux, mais j'ai voulu suivre la syntaxe que j'ai vu ailleurs aussi exactement que possible. Je vais modifier et supprimer les $function() {} déclaration au top, pour plus de clarté.
Mon point est qu'il semble clair que le events.load gestionnaire de tir immédiatement, et de manière synchrone, ce qui signifie qu'il n'y a aucune chance pour que l'objet soit retourné à la chart variable avant que le gestionnaire d'incendies. Si c'est le cas, alors cela signifie que le diagramme est rendu immédiatement, et il n'y a pas besoin d'un gestionnaire d'événement. Si oui, l'OP doit il suffit d'exécuter le code directement après l' chart affectation. De cette façon chart sera instancié et pleinement utilisable.

OriginalL'auteur kcbaker | 2013-11-23