я не начинаю с 0 - PullRequest
       2

я не начинаю с 0

1 голос
/ 19 февраля 2010

Этот код оповещает «тест 1», а затем предупреждает 8!

uri = 'http://www.scriptcopy.com/';
compareuris = new Array();
compareuris[0] = 'http://www.scriptcopy.com/';
compareuris[1] = 'https://www.scriptcopy.com/';
compareuris[2] = 'http://www.www.scriptcopy.com/';
compareuris[3] = 'https://www.www.scriptcopy.com/';
compareuris[4] = 'http://scriptcopy.com/';
compareuris[5] = 'https://scriptcopy.com/';
compareuris[6] = 'http://www.scriptcopy.com/';
compareuris[7] = 'https://www.scriptcopy.com/';
searchuri = 'http://www.google.com/search?';
searchuri += 'q='+ encodeURIComponent(uri) +'&btnG=Search+Directory&hl=en&cat=gwd%2FTop';
req = new XMLHttpRequest();
req.open('GET', searchuri, true);
req.onreadystatechange = function (aEvt) {
    if (req.readyState == 4) {
        if(req.status == 200) {
            searchcontents = req.responseText;
            parsedHTML = sc_HTMLParser(searchcontents);
            sitefound = sc_sitefound(compareuris, parsedHTML);
        }
    }
}
req.send(null);
function sc_HTMLParser(aHTMLString){
   var parseDOM = content.document.createElement('div');
   parseDOM.appendChild(Components.classes['@mozilla.org/feed-unescapehtml;1']
      .getService(Components.interfaces.nsIScriptableUnescapeHTML)
      .parseFragment(aHTMLString, false, null, parseDOM));
   return parseDOM;
}
function sc_sitefound(compareuris, parsedHTML) {
    gclasses = parsedHTML.getElementsByClassName('g');
    alert('test 1');
    for (i = 0; i < gclasses.length; i++) {
        alert(i);
        gclass = gclasses[i];
        atags = gclass.getElementsByTagName('a');
        tag1 = atags[0];
        hrefattribute1 =  tag1.getAttribute('href');
        uri1 = hrefattribute1;
        compareduris = sc_compareuris(uri1, compareuris);
        alert('test 2');
        if (compareduris) {
            sitefound = uri1;
            return sitefound;
            alert('test 3');
        }
        alert('test 4');
    }
    return null;
}
function sc_compareuris(uri, compareuris) {
    for (i = 0; i < compareuris.length; i++) {
        compareuri = compareuris[i];
        if (uri == compareuri) {
            return true;
        }
    }
    return false;
}

В центре внимания:

    alert('test 1');
    for (i = 0; i < gclasses.length; i++) {
        alert(i);

Почему и как решить?

Ответы [ 3 ]

4 голосов
/ 19 февраля 2010

У меня раньше были такие проблемы в IE. Вы должны всегда использовать var в цикле for, чтобы убедиться, что i имеет локальную область действия:

alert('test 1'); 
for (var i = 0; i < gclasses.length; i++) { 
    alert(i);
    // etc...
}

Если вы заранее не объявите переменную в той же области:

var i;
alert('test 1'); 
for (i = 0; i < gclasses.length; i++) { 
    alert(i);
    // etc...
}

Смотри также:

Область видимости переменной в Javascript для цикла
http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/Var

1 голос
/ 19 февраля 2010

Объявляйте переменные (в данном случае i) локально в каждой из функций, которые вы используете. Если вы присваиваете значение переменной (даже с циклом for), она становится глобальной переменной и может быть изменена по сравнению с другими функциями, выполняющимися одновременно.

1 голос
/ 19 февраля 2010

У вас есть другие оповещения, не вставленные туда? Что если вы измените его на:

alert('test 1, gclasses.length = '+gclasses.length);
for (var i = 0; i < gclasses.length; i++) {
    alert(i);

Мне интересно, выполняется ли этот цикл вообще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...