javascript 在具有iFrames的页面上递归getElementsByTagName

icnyk63a  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(103)

尝试使用using document.getElementsByTagName on a page with iFrames - elements inside the iframe are not being picked up提供的有用代码,但两个示例似乎都查看了iframe的第一“级别”,而不是其他iframe中的iframe。
尝试:

const subtreeSet = (root, theset) => {
    if (!theset) theset=new Set();
    if (!root || theset.has(root)) return theset;
    theset.add(root);
    if (root.shadowRoot) {
        Array.from(root.shadowRoot.children).forEach(child => subtreeSet(child, theset));
    } else {
        if (root.tagName === 'IFRAME') { try { root=root.contentDocument.body; theset.add(root); } catch (err) { root=null; /* CORS */ } }
        if (root && root.getElementsByTagName) for (const child of root.getElementsByTagName('a')) subtreeSet(child, theset);
    }
    return theset;
}

console.log(subtreeSet(document));

我希望看到所有链接,但只看到了不在嵌套iframe中的链接。

bpsygsoo

bpsygsoo1#

HTML中的iframe是一个有点特殊的标签。要访问此标签,您有2个选项contentWindowcontentDocument。您可以在此链接Stack OverFlow question中获得信息。
之后,你可以检查这个other link来了解如何合并这两个属性。代码应该是这样的:

var iframe = document.getElementById('iframeId');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var innerTag = innerDoc.getElementsByTagName('a');

记住,在你的代码中,你正在执行root.contentDocument.body,这个.body是不正确的。

相关问题