цикл, который не хочет запускаться - PullRequest
0 голосов
/ 04 июля 2011

У меня есть этот код:

<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 (for (var p=0; p< imgarr.length; p++){) вообще не запускается, но с первым все в порядке.Как это исправить?

PS: я пытался передать обратный вызов, как это: xhr.onreadystatechange = function(imgprocess) {, но он не работает.Он говорит, что объект «uncaught typeerror» не является функцией.

1 Ответ

3 голосов
/ 04 июля 2011
 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...