2015-08-31 74 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慢(不是那通常重要)。