您好我有以下脚本
该页面也可以看到in action here
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml2/DTD/xhtml1-strict.dtd">
<!-- Version: 1.0.0 -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Flot Examples</title>
<link href="layout.css" rel="stylesheet" type="text/css">
<!--[if lte IE 8]><script language="javascript" type="text/javascript" src="../excanvas.min.js"></script><![endif]-->
<script language="javascript" type="text/javascript" src="../jquery.js"></script>
<script language="javascript" type="text/javascript" src="../jquery.flot.js"></script>
</head>
<body onLoad="myFunction()">
<a href="javascript:printing()">Show All Coverafdedge</a>
Show: </div>
<p><span id="x">0</span>, <span id="y">0</span></p>
<p><input id="enableTooltip" type="checkbox">Enable tooltip</p>
<script type="text/javascript">
var datasets = [];
var xmlhttp;
function loadXMLDoc(url,cfunc){
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=cfunc;
xmlhttp.open("GET",url,true);
xmlhttp.send();
}
function myFunction(){
loadXMLDoc("parsers.json",handleXML);
}
var checkState = function(xmlhttp, callback) {
//document.write(xmlhttp.readyState);
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
callback();
} else {
// Check back again 1 sec later
setTimeout(checkState, 1000);
}
};
function handleXML() {
checkState(xmlhttp, function() {
var txt=xmlhttp.responseText;
datasets = [];
var datasetsCounter =0;
var secondPos = 0;
var aPosition = 0;
var currentCharacterLocation =0;
var textLeft =txt;
do
{
aPosition = textLeft.indexOf("#");
secondPos = textLeft.indexOf(";");
evaluedText = textLeft.substring(aPosition+1,secondPos);
datasets[currentCharacterLocation] = eval("(" + evaluedText + ")");
currentCharacterLocation++;
textLeft = textLeft.substring(secondPos + 1);
}
while (textLeft.indexOf("#") > -1);
});
}
function printing(){
for(var g =0; g < datasets.length; g++ ){
document.write(datasets[g].cover.data + "__");
}
}
$(function () {
var d1 = [];
var d2 = datasets[0].cover.data;
// a null signifies separate line segments
var d3 = [[0, 12], [7, 12], null, [7, 2.5], [12, 2.5]];
$.plot($("#placeholder"), [ d1, d2, d3 ]);
});
</script>
</body>
</html>
现在我的问题是我有变量“datasets”,如果我试图打印出“datasets [0] .cover.data”(就像我在我的函数print()中那样,我可以这样做(尝试自己点击该页面上的链接。)但是当我尝试在
中使用变量时“var d2 = datasets [0] .cover.data”,我得到的错误是其数据集[0] .cover.data未定义:S
任何人都知道我在这里做错了什么? =)
由于
答案 0 :(得分:0)
您的函数在文档就绪时运行,但在填充datasets
变量之前。
将代码移动到回调函数的末尾:
do
{
...
}
while (textLeft.indexOf("#") > -1);
var d1 = [];
var d2 = datasets[0].cover.data;
// a null signifies separate line segments
var d3 = [[0, 12], [7, 12], null, [7, 2.5], [12, 2.5]];
$.plot($("#placeholder"), [ d1, d2, d3 ]);
});
}
答案 1 :(得分:0)
您在调用“var d2 = datasets [0] .cover.data”时尚未初始化数组。
答案 2 :(得分:0)
嗯,那时datasets
没有任何内容,所以没有数据集[0],所以当然没有datasets[0].cover.data
!
问问自己:数据集应该如何填充,以及何时何地发生?
它会在handleXML
中填充,但只有在 var d2
行之后才会发生。
此外,使用eval
通常不赞成,有关详细信息,请参阅this stackoverflow question。
答案 3 :(得分:0)
你的问题是$(function(){...})中的函数;在调用body onload时正在运行。你需要做一些像
这样的事情$(function () {
loadXMLDoc("parsers.json", function () {
handleXML(); // possibly add a callback to this function which calls the remaining code in this function
var d1 = [];
var d2 = datasets[0].cover.data;
// a null signifies separate line segments
var d3 = [[0, 12], [7, 12], null, [7, 2.5], [12, 2.5]];
$.plot($("#placeholder"), [d1, d2, d3]);
});
});
然后从body onload
中删除调用