如何使用jQuery访问iFrame父页面?

282

我有一个iframe,为了访问父元素,我实现了以下代码:

window.parent.document.getElementById('parentPrice').innerHTML

如何使用jQuery获得相同的结果?
更新: 或者如何使用jQuery访问iFrame的父页面?


请参见https://dev59.com/Smct5IYBdhLWcg3wa8s_#36445098。 - Alexis Wilke
9个回答

523

要在 iFrame 的父级元素中查找,请使用:

$('#parentPrice', window.parent.document).html();

$()包装器的第二个参数是要搜索的上下文。默认为document。


19
好的 - 你在他感谢之前就已经回应了他的感谢。 StackOverflow可能有时区问题? - belugabob
28
你也可以这样做:$(window.parent.document).find("#parentPrice").html(); - jhorback
1
对于那些使用window.open打开了一个新窗口的人,请不要忘记旧的JS标准window.opener.document。$("#someDiv", window.opener.document)可以正常工作。 - jjohn
$("#someDiv", top.document) 是什么意思? - Gabriel Nahmias
3
只有当iframe的源代码已经加载了jQuery,这个方法才能生效。根据我的经验,iframe的源代码通常不会包含jQuery库,但是我们需要调用父级页面上的jQuery函数,此时可以使用以下方法:window.document.$("#parentPrice").html(),这是Álvaro G. Vicario发布的答案。 - David Kinkead
显示剩余2条评论

41

如何使用 jQuery 访问 iFrame 的父页面

window.parent.document.

jQuery 是 JavaScript 的一个库,不是完全替代它。您不必用$来替换每一个JavaScript表达式。


6
jQuery很好用,但是对于一些简单问题的回答似乎总是“使用jQuery”。如果你已经加载了这个库,那么可以使用它,但不要因为一个任务而加载它。此外,人们似乎关注JS的性能表现,那么可以使用JS上面的API来轻松地完成可能不需要API甚至更快的事情。 - Grant Wagner
1
@Grant 虽然我梦想着 jQuery 成为浏览器内置代码。 - Dan Blows
3
@Blowski: 这就是我噩梦的原因!jQuery包含了许多非常复杂和脆弱的“做我想要的”代码,这完全不适合放在官方API中。 - bobince
1
@bobince:显然,你应该 总是 用 jQuery 替换所有的 Javascript。这就像培根一样;不可能有更少就更好的情况。 ;) - MW.
2
OP已经有了window.parent.document,所以这并没有回答任何问题。而且想象一下选择器逻辑比元素ID复杂得多的情况,这时候jQuery非常方便。我觉得问题就像是“如何用法语说‘你好’?”而这个答案却是“用德语说”。 - grantwparks
显示剩余2条评论

15

如果您需要在父文档中找到 jQuery 实例(例如,调用插件提供的实用函数),请使用以下语法之一:

  • window.parent.$
  • window.parent.jQuery

示例:

window.parent.$.modal.close();

jQuery会附加到window对象上,这就是window.parent的含义。


我正在使用我的 iframe 作为用户控件。这让我保持它的整洁和清晰。 - Dan Randolph

14

您可以通过使用 window.parent 从 iframe 内访问父窗口的元素,如下所示:

// using jquery    
window.parent.$("#element_id");

这与以下内容相同:

// pure javascript
window.parent.document.getElementById("element_id");

如果您有多个嵌套的iframe,并且想要访问最顶层的iframe,则可以像这样使用window.top

// using jquery
window.top.$("#element_id");

这与以下内容相同:

// pure javascript
window.top.document.getElementById("element_id");

7
在父窗口中输入以下内容:
<script>
function ifDoneChildFrame(val)
{
   $('#parentPrice').html(val);
}
</script>

在iframe的src文件中放置以下内容:
<script>window.parent.ifDoneChildFrame('Your value here');</script>

6

我也成功了。

注意:我们需要使用window.parent.document。

    $("button", window.parent.document).click(function()
    {
        alert("Functionality defined by def");
    });

5

对我来说它很有效,只需做出小调整即可。在我的情况下,我需要将弹出窗口JS的值填充到父级窗口表单中。

因此,我使用了$('#ee_id',window.opener.document).val(eeID);

太棒了!


3
可能我来晚了一点,但我刚发现这个很棒的jQuery插件https://github.com/mkdynamic/jquery-popupwindow。它基本上使用一个onUnload回调事件,因此它会侦听子窗口的关闭,并在那时执行任何必要的操作。所以在子窗口中没有必要编写任何JS代码来传回父窗口。

1

有多种方法可以实现这些。

I)直接获取主要的父级。

例如,我想将我的子页面替换为 iframe,则可以:

var link = '<%=Page.ResolveUrl("~/Home/SubscribeReport")%>';
top.location.replace(link);

这里 top.location 直接获取父级。

II) 逐级获取父级。

var element = $('.iframe:visible', window.parent.document);

如果有多个iframe,则需要指定活动或可见的iframe。

您还可以使用以下方法获取更多父级元素:

var masterParent = element.parent().parent().parent()

III) 根据标识符获取父级。
var myWindow = window.top.$("#Identifier")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接