2014-09-30 90 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(); 
    } 
} 

这样,从列表中删除结束元素不应该影响你的列表中的位置。

相关问题