2010-02-19 3 views
1

Этот код предупреждает «тест 1», а затем предупреждает 8!i не начинается с 0

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; 
} 

Spotlight:

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

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

+1

Запустите его сначала через JSLint: «Проблема с символом строки 23: пропавшая точка с запятой». –

ответ

4

У меня были проблемы, подобные этому в 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... 
} 

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

Variable scope in Javascript for loop
http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/Var

1

Есть ли у вас какие-либо другие предупреждения, не вставленные в них? Что, если вы измените его на:

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

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

1

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

Смежные вопросы