Html getElementsByTagName返回包含null元素的数组
我有这样一个脚本:Html getElementsByTagName返回包含null元素的数组,html,dom,tampermonkey,Html,Dom,Tampermonkey,我有这样一个脚本: // ==UserScript== // @name Remove strong tags // @namespace http://tampermonkey.net/ // @version 0.1 // @description remove answers // @author You // @match http://*/* // @grant GM_log // @run-at d
// ==UserScript==
// @name Remove strong tags
// @namespace http://tampermonkey.net/
// @version 0.1
// @description remove answers
// @author You
// @match http://*/*
// @grant GM_log
// @run-at document-end
// ==/UserScript==
setTimeout((function() {
'use strict';
var allStrong = document.getElementsByTagName("strong");
GM_log(allStrong);
for (var i=0, max=allStrong.length; i < max; i++) {
var strong = allStrong.item(i);
GM_log(strong);
if(strong && strong.parentNode.tagName == "LI") {
strong.parentNode.appendChild(strong.firstChild);
strong.parentNode.removeChild(strong);
}
}
})(), 5000);
在符合条件的8个强标记中,它仅替换4个
这是在Chrome控制台上打印的
第一次打印时数组有8个元素,但最后4个元素打印为未定义
为什么会这样
我不认为问题来自于在整个页面加载之前执行的代码,因为我设置了一个很大的超时
是我运行它的页面。第一个打印输出显示了8个元素,因为此时它就是这样。但它是一个HTMLCollection,在HTMLDOM中它是活动的;当基础文档发生更改时,它会自动更新 for循环在变强时删除其中一些节点。parentNode.removeChildstrong;,但只计算集合开始处的长度max=allStrong.length。所以它仍将运行8次,但当它达到一半时,它将不进行任何迭代 当您展开第一行日志时,Chrome会评估live HTMLCollection,此时它只包含4个元素,因此只显示4个元素。行尾的小i告诉你这个表达式是什么时候计算的 如果您希望实时查看所有这些内容,而不是将其放入setTimeout中,我建议在您的代码中添加以下语句,无论您希望从何处开始逐步查看:
debugger;
返回一个所谓的活动节点列表,而不是一个静态数组-这意味着它包含查询的最新结果
因此,在每次迭代之后,其中一个元素将被删除,因为它不再是元素
您有两种选择:
将节点列表转换为普通数组,例如使用
始终访问节点列表的第一个元素