如何获取在getElementsByTagName中返回的DOM子数组中的元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取在getElementsByTagName中返回的DOM子数组中的元素相关的知识,希望对你有一定的参考价值。

有没有办法检测从getElementsByTagName()返回的代理对象中的元素?我需要从下面的代码中添加EventListener到返回的svgs

const svgs= document.getElementsByTagName('svg');
console.log('svgs',svgs);
const myArray = Array.from(svgs); 
console.log('myArray ',myArray); // This is returning [] 

下面是我在控制台中可以看到的日志。有人可以帮我把svgs => target => htmlCollection(49)变成数组enter image description here

答案

原因是这些svg元素显然是异步添加到文档中的。当你查看控制台并打开svgs结构时,svg元素已被加载,但在你的代码运行并创建数组时,情况并非如此。你看到他们是因为the console's lazy loading

如果在页面加载时加载了svg元素,那么您可能很幸运,您可以将代码包装在以下内容中:

window.onload = () => { /* your code */ }

但是更有可能的是,这些内容是通过一些Ajax调用加载的,然后上面的内容不会有帮助。

您可以收听DOM突变事件:

const svgs = document.getElementsByTagName('svg');
console.log(svgs.length); // <-- presumably outputs 0

const listener = new MutationObserver(updated);
// This listens to changes under the BODY element. If you can be more 
// precise, then do so (to save resources). If you can do without
// the subtree option, then that is also preferred:
listener.observe(document.body, { childList: true, subtree: true });

function updated() {
    console.log(svgs.length); // <-- notice the increased length
    // Do whatever else you want to do with this collection.

    // If you are sure you have all you need, then stop the listener:
    listener.disconnect();
}

如果元素全部“一次”填充,并且您只需要调用一次事件监听器,那么您可能仍需要使用一些debouncing pattern进行调整。

以上是关于如何获取在getElementsByTagName中返回的DOM子数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章

利用getElementsByTagName() 属性获取到的属性,获取不到innerHTML

getElementsByTagName

document.getElementsByTagName获取js写的一个页面里面的标签

JavaScript错误:SCRIPT5007:无法获取属性'getElementsByTagName'

js如何获取某id的子标签?

js如何获取页面 元素