2015-08-31 3 views
1

Это не похоже на то, что я не мог этого сделать в противном случае, но мне просто интересно: почему этот код сбрасывает вкладку браузера?Зачем эта вкладка браузера сбой?

var links = document.getElementsByTagName("a"); 
for (var i = 0; i < links.length; i++) { 
    var a = document.createElement("A"); 
    a.innerHTML = "[?]"; 
    a.href = links[i].href; //this is the evil line 
    a.onclick = function() { 
     return false; 
    }; 
    links[i].parentNode.appendChild(a); 
} 

ответ

8

Поскольку NodeList (я думаю, что они называют это HTMLCollection сейчас) вы получите обратно от getElementsByTagNameявляется живой. Поэтому, когда вы добавляете новый документ a в документ, браузер добавляет его в список, который вы просматриваете. Поскольку вы добавляете еще один каждый раз, когда вы зацикливаете, вы никогда не достигнете конца цикла.

Если вы хотите отключенный массив или коллекцию вместо этого, вы можете сделать:

var collection = document.querySelectorAll("a"); 

или

var array = Array.prototype.slice.call(document.getElementsByTagName("a")); 

querySelectorAll поддерживает полный спектр CSS селекторов. Он поддерживается всеми современными браузерами, а также IE8. Но это может быть медленнее клонирования getElementsByTagNameNodeList (не то, что обычно имеет значение).

3

Element.getElementsByTagName() возвращает живойHTMLCollection, то есть каждый раз, когда вы добавляете новый элемент ссылки на страницу, длину ссылка увеличивается, что приводит к бесконечному циклу.

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