2014-09-30 132 views
0

我發現了一個問題... 我正在寫油脂和tampemonkey的應用程序,它應該改變一個網站的外觀。javascript只刪除每一個第二個元素

我的一個任務是要與標題New Post
<img src="..." title="New Post" alt="...">

刪除所有圖像,我有以下snipplet:

elements = document.getElementsByTagName('img'); 

alert(elements.length); // FIRST 

for (i=0; i < elements.length; i++) { 
    image = elements[i]; 

    if (image.title.search(/New\ Post/) > -1) { 
     image.remove(); 
    } 
} 

alert(i); // SECOND 

這snipplet刪除圖像,但只有每一秒。 第一次警報給我的號碼19,但第二次警報給出10 ...

該腳本應該刪除每個具有給定標題的圖像標籤。 我做錯了什麼?

+1

提示:https://developer.mozilla.org/en-US/docs/Web/API/Console.log – RichieAHB 2014-09-30 10:10:50

+0

@richieahb - 我認爲這不會在用戶腳本內工作 – fechnert 2014-09-30 10:13:41

回答

1

因爲document.getElementsByTagName('img')返回一個實時列表,這意味着當您在返回列表中的元素上調用remove()時,移除的項目也將從該數組中移除。

document.getElementsByTagName

返回具有給定標記名稱的元素的HTMLCollection。搜索完整文檔 ,包括根節點。 返回的 HTMLCollection是實時的,這意味着它自動更新自身 以保持與DOM樹同步,而無需再次調用 document.getElementsByTagName()

嘗試

var log = (function() { 
 
    var $log = $('#log'); 
 
    return function(msg) { 
 
    $('<p/>', { 
 
     text: msg 
 
    }).appendTo($log) 
 
    } 
 
})(); 
 

 

 
var elements = document.getElementsByTagName('img'); 
 

 
log('initial: ' + elements.length); 
 

 
for (i = 0; i < elements.length;) { 
 
    image = elements[i]; 
 

 
    if (image.title.search(/New\ Post/) > -1) { 
 
    image.remove(); 
 
    log('remove: ' + elements.length); 
 
    } else { 
 
    i++ 
 
    log('not: ' + elements.length); 
 
    } 
 
} 
 

 
log('end: ' + elements.length);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<img title="New Post" src="//placehold.it/64/fff000" /> 
 
<img title="New1 Post" src="//placehold.it/64/000fff" /> 
 
<img title="New Post" src="//placehold.it/64/fff000" /> 
 
<img title="New1 Post" src="//placehold.it/64/000fff" /> 
 
<img title="New Post" src="//placehold.it/64/fff000" /> 
 
<img title="New1 Post" src="//placehold.it/64/000fff" /> 
 

 
<div id="log"></div>

0

只有遞增循環計數器,如果你不去除圖像:像你刪除,而元素

for (i=0; i < elements.length;) { 
    image = elements[i]; 

    if (image.title.search(/New\ Post/) > -1) image.remove(); 
    else i++; 
} 
3

它看起來循環遍歷你將它們從中刪除的列表。在刪除多於剩餘空間的位置,ielements.length相同,因此循環會在全部刪除之前退出。

嘗試以相反的順序刪除它們:

for (i=elements.length - 1; i >= 0; i--) { 
    image = elements[i]; 

    if (image.title.search(/New\ Post/) > -1) { 
     image.remove(); 
    } 
} 

這樣,從列表中刪除結束元素不應該影響你的列表中的位置。

相關問題