Javascript 从iFrame中获取元素
如何从Javascript 从iFrame中获取元素,javascript,iframe,html,Javascript,Iframe,Html,如何从中获取 你可以更简单地写: var iframe = document.getElementById('iframeId'); var innerDoc = iframe.contentDocument || iframe.contentWindow.document; 并返回第一个有效的内部单据 一旦获得了内部文档,就可以像访问当前页面上的任何元素一样访问其内部。(innerDoc.getElementById等) 重要提示:确保iframe位于同一个域上,否则无法访问其内部。这将是跨
中获取
你可以更简单地写:
var iframe = document.getElementById('iframeId');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
并返回第一个有效的内部单据
一旦获得了内部文档,就可以像访问当前页面上的任何元素一样访问其内部。(innerDoc.getElementById
等)
重要提示:确保iframe位于同一个域上,否则无法访问其内部。这将是跨站点脚本编写。window.parent.document.getElementById(“framekit”).contentWindow.CallYourFunction(“传递值”)
CallYourFunction()
是页面中的函数,而页面上的函数操作其他答案都不适用于我。我最终在iframe中创建了一个函数,返回我要查找的对象:
function getElementWithinIframe() {
return document.getElementById('copy-sheet-form');
}
然后像这样调用该函数以检索元素:
var el = document.getElementById("iframeId").contentWindow.functionNameToCall();
加载iframe后不要忘记访问它。没有jQuery的老而可靠的方法:
<iframe src="samedomain.com/page.htm" id="iframe" onload="access()"></iframe>
<script>
function access() {
var iframe = document.getElementById("iframe");
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
console.log(innerDoc.body);
}
</script>
函数访问(){
var iframe=document.getElementById(“iframe”);
var innerDoc=iframe.contentDocument | | iframe.contentWindow.document;
console.log(innerDoc.body);
}
以上答案使用Javscript提供了很好的解决方案。
下面是一个简单的jQuery解决方案:
$('#iframeId').contents().find('div')
这里的技巧是jQuery的.contents()
方法,与只能获取HTML元素的.children()
不同,.contents()
可以同时获取文本节点和HTML元素。这就是为什么可以通过使用iframe来获取iframe的文档内容
进一步阅读jQuery.contents()
:
注意iframe和页面必须在同一个域上。下面的代码将帮助您找到iframe数据
let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
如果iframe不在同一个域中,因此您无法从父级访问其内部,但您可以修改iframe的源代码,那么您可以修改iframe显示的页面以向父级窗口发送消息,从而允许您在页面之间共享信息。一些资料来源:
注意:请记住,页面上的每个iFrame都需要具有相同的来源,否则此函数将抛出错误。回答得很好。您知道您可以这样做吗:var innerDoc=iframe.contentDocument | | iframe.contentWindow.document//更具可读性,意味着sameI已经看到人们被三元运算符所迷惑。他们似乎不知道是否返回了第一个有效的密码。事实上,当我编辑答案以包含它时,我身后的那个家伙问我这有什么用……为了简单起见,可能比使用更复杂的代码更好:)@JellicleCat:任何绕过这一点的方法都是“跨站点请求伪造”,也称为“一键式”攻击或“会话骑行”是指从iFrame调用函数,而不是获取元素的引用。为什么要重复9年前发布的已接受答案中的部分建议?至少删除此答案会为您赢得一个同伴压力徽章…
let iframe = document.getElementById('frameId');
let innerDoc = iframe.contentDocument || iframe.contentWindow.document;
function querySelectorAllInIframes(selector) {
let elements = [];
const recurse = (contentWindow = window) => {
const iframes = contentWindow.document.body.querySelectorAll('iframe');
iframes.forEach(iframe => recurse(iframe.contentWindow));
elements = elements.concat(contentWindow.document.body.querySelectorAll(selector));
}
recurse();
return elements;
};
querySelectorAllInIframes('#elementToBeFound');