Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.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
Javascript 控制台显示getElementsBy的不同输出。。。导致Array.prototype.slice.call在浏览器刷新时失败_Javascript_Arrays - Fatal编程技术网

Javascript 控制台显示getElementsBy的不同输出。。。导致Array.prototype.slice.call在浏览器刷新时失败

Javascript 控制台显示getElementsBy的不同输出。。。导致Array.prototype.slice.call在浏览器刷新时失败,javascript,arrays,Javascript,Arrays,我正在编写一个函数来收集所有锚元素并为它们编写侦听器。 如果我在Mac上刷新浏览器最新版本的Chrome和Firefox,有时元素集合会以不同方式显示,并导致我对Array.prototype.slice的调用返回空数组 function toArray(arr) { return Array.prototype.slice.call(arr); } let anchors = toArray(document.getElementsByTagName('a')); for (var i =

我正在编写一个函数来收集所有锚元素并为它们编写侦听器。 如果我在Mac上刷新浏览器最新版本的Chrome和Firefox,有时元素集合会以不同方式显示,并导致我对Array.prototype.slice的调用返回空数组

function toArray(arr) { return Array.prototype.slice.call(arr); }

let anchors = toArray(document.getElementsByTagName('a'));
for (var i = 0; i < anchors.length; i++) 
{ 
    anchors[i].addEventListener('click', clicked, false); 
}
console.log(document.getElementsByTagName('a'));
console.log(anchors);
当监听器正常工作时,控制台如下所示:

但当我刷新浏览器时,大部分时间它都会像这样返回:

如果我展开数组输出,它如下所示:


为什么它们有时会不同?是否有办法始终获得正确的结果?

在调用getElementsByTagName之前,脚本应该等待页面完成加载。否则,许多元素可能尚未加载,getElementsByTagName将无法检索它们

因此,将您的代码包装在onload事件处理程序中,例如:

onload = function() {
    let anchors = toArray(document.getElementsByTagName('a'));
    for (var i = 0; i < anchors.length; i++) 
    { 
        anchors[i].addEventListener('click', clicked, false); 
    }
    console.log(document.getElementsByTagName('a'));
    console.log(anchors);
}

根据Anis的反馈,我将代码包装在一个名为writeListeners的函数中,并尝试以两种不同的方式调用它:

在头文件中为脚本本身添加onload属性,然后 无法工作,因为脚本在DOM完成之前加载

文件末尾现有DOMContentLoaded函数的一部分。addEventListener'DOMContentLoaded',=>{writeListeners;};起初,由于尚未定义WriteListener,因此此操作失败。之所以发生这种情况,是因为包含函数的脚本被标记为async,并在DOMContentLoaded之后加载。我删除了async标记,以确保脚本能够更早地加载,现在就可以工作了


谢谢这让我走上了正确的方向!很高兴这有帮助!如果这回答了你的问题,请考虑以投票/标记作为答案。祝您今天过得愉快!顺便说一句,编写此toArray的现代方式是Array.from:-