在javascript中访问数组变量时出现问题

时间:2011-06-23 16:31:10

标签: javascript html

您好我有以下脚本

该页面也可以看到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

任何人都知道我在这里做错了什么? =)

由于

4 个答案:

答案 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

中删除调用