如何使用 jQuery 公开 IFrame 的 DOM?

IT技术 javascript jquery dom
2021-01-11 10:15:01

我有一个代表特定 IFrame 的原型。该原型有一个名为 GoToUrl(...) 的函数,用于在 IFrame 中打开给定的 url。

我的问题是:如何创建“InternalDOM”属性并使该属性引用内部 IFrame 的“窗口”对象(根 DOM 对象)?以这样的方式:如果我的 IFrame 公开了一个页面,该页面在它的“窗口”对象中有一个对象 X,我可以这样做:

MyFrameObject.GoToUrl(pageXurl);
MyFrameObject.InternalDOM.X

任何帮助,将不胜感激。

PS:我会接受不一定与 jQuery 相关的答案,但我更喜欢 jQuery 解决方案。

3个回答

要获取window框架对象,您可以使用window.frames数组:

var iframewindow= frames['iframe_name'];

这要求您提供<iframe>一个老式的name属性而不是id. 或者,如果您知道页面上 iframe 的顺序,您可以用数字索引它们:

var iframewindow= frames[0];

从 DOM 中的 iframe 元素获取 iframe 窗口通常更灵活,但这需要一些兼容代码来应对 IE:

var iframe= document.getElementById('iframe_id');
var iframewindow= iframe.contentWindow? iframe.contentWindow : iframe.contentDocument.defaultView;

jQuery 定义了contents()方法来获取document节点,但它没有为您提供从document到 的跨浏览器方式window,因此您仍然坚持:

var iframe= $('#iframe_id')[0];
var iframewindow= iframe.contentWindow? iframe.contentWindow : iframe.contentDocument.defaultView;

这不是一个很大的胜利。

(注意:使用 jQuery 进行跨框架脚本编写时要非常小心。每个框架都需要自己的 jQuery 副本,一个框架副本中的方法不一定适用于另一个框架的节点。跨框架脚本编写是一个充满陷阱。)

我更喜欢 $('#iframe-id').get(0).contentWindow
2021-03-16 10:15:01
esqsoft.com/javascript_examples/iframe_talks_to_parent - 关于跨 iframe 脚本的一个很好的例子和解释
2021-04-10 10:15:01

把它们加起来

从父页面访问 iframe 内容

var iframe = $('iframe').contents(); // iframe.find('..') ...

从 iframe 访问父页面内容

var parent = $(window.parent.document); // parent.find('..') ...

这仅适用于父页面和 iframe 页面位于同一域中的情况。

编辑:加载子 iframe 示例:

父 html

<iframe id="iframe1" src="iframe1.html"></iframe>
<iframe id="iframe2" src="iframe2.html"></iframe>

父js

$(function () {
    var iframe1 = null,
        iframe2 = null;

    // IE8/7
    var frameInterval = window.setInterval(function () {
        iframe1 = $('#iframe1').contents();
        iframe2 = $('#iframe2').contents();
        if ($('head', iframe1).length && $('head', iframe2).length) {
            window.clearInterval(frameInterval);
        }
    }, 100);

    // on iframe loaded
    $('#iframe1').on('load', function (e) {
        iframe1 = $('#iframe1').contents();
    });
    $('#iframe2').on('load', function (e) {
        iframe2 = $('#iframe2').contents();
    });
});

包括 IE9 在内的所有主要浏览器都可以使用这些on('load')行。只有 IE8/7 需要间隔块。

谢谢,节省了我一些时间:)
2021-04-10 10:15:01

更新@RoyiNamir 的评论:

var frames = window.frames || window.document.frames;

用于 iframe 中的窗口。

frames["myIframeId"].window

用于 iframe 中的文档

frames["myIframeId"].window.document

用于 iframe 中的正文

frames["myIframeId"].window.document.body

用于带有 jquery 的 iframe 中的正文

var iframeBody = $(frames["myIframeId"].window.document).contents().find("body");

重要提示:您应该始终检查文档是否处于“完成”状态以使用此

if (frames["myIframeId"].window.document.readyState=="complete")
{
   //ok
}
else
{
   //perform a recursive call until it is complete
}
@RoyiNamir 感谢您的澄清,在 IE 中工作正常但与其他浏览器不兼容
2021-03-13 10:15:01
@andres descalzo 自从您写下这个答案以来,我一直没有在调查更改,但window.document.frames不再起作用,至少在 Firefox 和 Chrome 中不起作用。编辑您的帖子。
2021-03-20 10:15:01