新的JavaScript。 在我的网页(asp.net应用程序,VB作为服务器端语言),我使用document.getElementsByTagName(“IMG”)来获取所有IMG标记HTML项目。 我注意到一个特别是在此列表中显示不出来(我可以把它们放进一个数组并访问项目单独 - 代码如下所示)。 此项目包含一个iframe内(iframe中不使用SRC或其他任何东西,只是定义,那么它里面的HTML是正确的,在源,犯规负载从另一个页面 - 这是由阅读器生成的水晶报表自动生成在运行时,这就是为什么我不能复制显示此)。 是的getElementsByTagName没有拿起这个形象,因为它是一个iframe中? 我需要能够访问此IMG的src(图像是从Crystal报表查看器另一个自动生成的项目)。 如果这是为什么不拿起原因是由于iframe,有没有什么办法无论是在iframe内的物品跑的? 或者只是得到了“的innerHTML”类型属性的iframe内的一切,这样的IMG SRC可以访问。 谢谢您的帮助。
var IMGmatches = [];
var IMGelems = document.getElementsByTagName("img");
for (var j = 0; j < IMGelems.length; j++) {
IMGmatches.push(IMGelems[j]);
}
这是因为使用iframe中的元素是不是父文档的一部分。
为了得到一个iframe内的任何东西,你需要访问iframe的contentDocument
。 所以,你的代码可能是这样的:
var IMGmatches = [], IMGelems = document.getElementsByTagName("img"),
iframes = document.getElementsByTagName('iframe'), l = IMGelems.length,
m = iframes.length, i, j;
for( i=0; i<l; i++) IMGmatches[i] = IMGelems[i];
for( j=0; j<m; j++) {
IMGelems = iframes[j].contentDocument.getElementsByTagName("img");
l = IMGelems.length;
for( i=0; i<l; i++) IMGmatches.push(IMGelems[i]);
}
下面是将返回一组中所有元素的从( 并包括 )一个根,包括内部框架在可能的(非CORS)和阴影DOM的函数:
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('*')) subtreeSet(child, theset); } return theset; } subtreeSet(document).forEach(elem => { if (elem.style) elem.style.backgroundColor='yellow'; });
<div>TOP</div><br> <div>IFRAME<br><iframe></iframe></div>
只在Chrome中进行测试
文章来源: using document.getElementsByTagName on a page with iFrames - elements inside the iframe are not being picked up