2011-07-04 7 views
0

실행하려면 : "SRC는 정의의 읽을 수 없습니다" 는이 코드가

<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();"> 

이 코드를 실행

이 오류는 말한다 약 var z = imgarres[0].src; 그 라인 확장 작품에서 src를 제거하면 오류없이 실행하지만 imgprocess 루틴이 예상 값을 반환하지 않습니다! 예상 값은 imgurl이며 src에서 제거한 값입니다. 두 번째 for 루프 ( for (var p=0; p< imgarr.length; p++){)는 전혀 실행되지 않지만 첫 번째 루프는 정상입니다. 이 문제를 어떻게 해결할 수 있습니까?

피씨 : 다음과 같이 콜백을 시도해 보았습니다. xhr.onreadystatechange = function(imgprocess) { 하지만 작동하지 않습니다. 그것은 "잡히지 않은 typeerror"객체가 함수가 아니라고 말합니다.

답변

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

위의 코드에서 하나의 요소로 배열을 덮어 쓰는 것처럼 보입니다.

추가 편집 :

은 if 조건이 참이면, imgels[i]은 (AN src와) 요소가 대신 imgels을 추가하는 [내가]를 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

관련 문제