2011-07-04 80 views
0

我有这样的代码:for循环,这并不需要运行

<script type="text/javascript"> 
var url = "http://www.xxxxx.xxx/xxxxxxxxx"; 

var txt; 
var id1; 
var id2; 
var imgarres = []; 
var imgarr = []; 
var imgels = []; 

function getdata() { 
    if (id1){clearTimeout(id1);} 
    if (id2){clearTimeout(id2);} 

    var xhr = new XMLHttpRequest(); 
    xhr.open('GET',url, true); 
    xhr.setRequestHeader('Cache-Control', 'no-cache'); 
    xhr.setRequestHeader('Pragma', 'no-cache'); 

    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4) { 
      txt = xhr.responseText; 

      var r = txt.indexOf('<b class="fl_r">Online</b>'); 
      var el = document.createElement("div"); 

      el.innerHTML = txt; 

      var n = imgprocess(el);  
      var nam = el.getElementsByTagName("title")[0].innerHTML; 

      if (r != -1) { 
       var notification = webkitNotifications.createNotification('plus.gif', nam, 'online!!'); 
       notification.show(); 
       var id1 = setTimeout(getdata, 60000); 
      } else { 
       var notification = webkitNotifications.createNotification(n, nam, 'offline!!'); 
       notification.show(); 
       var id2 = setTimeout(getdata, 600000); 
      } 
     } 
    } 

    xhr.send();  
} 

function imgprocess(text) { 
    imgels = text.getElementsByTagName("IMG"); 
    for (var i=0;i< imgels.length;i++) { 
     if (imgels[i].src.indexOf(parse(url)) != -1) { 
      imgarr = imgels[i]; 
     } 
    } 

    for (var p=0; p< imgarr.length; p++) { 
     if (imgarr[p].parentNode.nodeName=="A") { 
      imgarres = imgarr[p]; 
     } 
    } 

    var z = imgarres[0].src; 
    return z; 
} 

function init() { 
    getdata(); 
} 
</script> 
</head> 
<body onload="init();"> 

当我执行这个代码,错误说:“SRC无法读取的未定义”关于var z = imgarres[0].src;当我从那条线,扩建工程中删除src没有错误,但 imgprocess例程不会返回期望值!预期值是imgurl,这是我删除的src。看起来第二个循环(for (var p=0; p< imgarr.length; p++){)根本没有运行,但第一个是OK。我该如何解决?

P.S .:我试着像这样传递回调:xhr.onreadystatechange = function(imgprocess) { 但它不起作用。它表示“未捕获的typeerror”对象不是函数。

回答

3
if (imgels[i].src.indexOf(parse(url)) != -1){ 
    imgarr = imgels[i]; 
} 

它看起来像你在上面的代码中用单个元素覆盖数组。

添加编辑:

如果if条件为真,imgels[i]是元件(具有src),但代替添加imgels [I]到imgarr阵列,要更改imgarr为指向单个元件。

然后在第二个for循环中,您将它视为一个数组。

事实上,这在第二个循环中也是一个错误。 imgarres应该是一个数组或不是?如果是,那么imgarres = imgarr[p];是错误的(它指向一个元素后,你这样做)。如果不是那么var z = imgarres[0].src;是错误的(如果它是一个元素,你不需要[0])。

添加编辑:

somearray = someelement; 

元素不添加到阵列中!

somearray.push(someelement); 

确实。

添加编辑:只是试试这个。谁知道,它可能会工作...

function imgprocess(text){ 
// get all IMG elements below the div 
imgels = text.getElementsByTagName("IMG"); 
// filter them somehow 
imgarr = []; 
for (var i=0;i< imgels.length;i++){ 
    if (imgels[i].src.indexOf(parse(url)) != -1){ 
    imgarr.push(imgels[i]); 
    } 
} 

// filter again, could probably be joined into one loop 
imgarres = []; 
for (var p=0; p< imgarr.length; p++){ 
    if (imgarr[p].parentNode.nodeName=="A"){ 
    imgarres.push(imgarr[p]); 
    } 
} 
// return the first image's src if any 
if (imgarres.length > 0) { 
    return imgarres[0].src; 
} 
return null; 
} 
+0

你是什么意思?我首先检查与console.log(imgarr)循环;第一个for循环很好.. – DrStrangeLove

+0

我添加了一些解释并解释了为什么第二个循环是错误的。 – lmz

+0

那么为什么console.log(imgarr)输出我需要的img元素? – DrStrangeLove