Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html getElementsByTagName返回包含null元素的数组_Html_Dom_Tampermonkey - Fatal编程技术网

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;
返回一个所谓的活动节点列表,而不是一个静态数组-这意味着它包含查询的最新结果

因此,在每次迭代之后,其中一个元素将被删除,因为它不再是元素

您有两种选择:

将节点列表转换为普通数组,例如使用 始终访问节点列表的第一个元素