Javascript 控制台显示getElementsBy的不同输出。。。导致Array.prototype.slice.call在浏览器刷新时失败
我正在编写一个函数来收集所有锚元素并为它们编写侦听器。 如果我在Mac上刷新浏览器最新版本的Chrome和Firefox,有时元素集合会以不同方式显示,并导致我对Array.prototype.slice的调用返回空数组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 =
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:-