jQuery:在子窗口接收document ready()

13

我想在打开的子窗口文档加载并准备就绪时得到通知。但是以下方法似乎不起作用:

win = window.open(href, 'test', 'width=300, height=400');
win.focus();
$(win.document).ready(function() {
           // Ok, the function will reach here but if I try to manipulate the
           // DOM it doesn't work unless I use breakpoints
           $(this).contents().find("...").doStuff(); // nothing happens
    });

我需要做什么?


谢谢 McLovin!这帮助我解决了类似的问题。 - DevDave
4个回答

10

你试过这个吗?—

$(win.document).ready(function() {
    $(win.document).contents().find("...").doStuff();
});

这个问题讨论了非常相似的内容。是否重复?


4
是的,我也尝试过那个方法。如果我的测试结论是正确的话,问题在于当DOM树还没有真正准备好时,ready()函数就被触发了。 - mrmclovin
1
你是否也尝试了在其他问题的答案中提到的纯JS方法? - polarblau
5
可以,谢谢!需要手动使用JavaScript来实现,我做了以下更改: win.onload = function() { form = $(this.document.getElementById(form_id)); form.submit(function(evt){ - mrmclovin
2
这个不起作用,需要使用 win.onload = function() {}。 - iamkrillin

6

我曾经遇到过类似的问题,对于我来说,window上的.load事件有效,而.ready则无效。因此你可以尝试以下内容:

win = window.open(href, 'test', 'width=300, height=400');
$(win).load(function() {
    $(this).contents().find("...").doStuff(); 
});

这在Chrome和FF中对我有效,但IE没有运行加载回调。最终我添加了一个自我取消的setInterval来检查子窗口是否准备好并运行代码。 - Andrew
1
我研究了为什么ready无法工作,现在分享一下。 $(win.document).ready$(window).ready是完全等价的。 请参见源代码。 (注意:即使在此问题发布时,即2011年,ready的功能也类似于v3.3.1) 正如Gunni建议的那样,我们应该使用load代替ready实现目的。 - anqooqie

1
在加载并执行全局函数的站点上,使用中的脚本。
主页:
<html>
<head>
<script type="text/javascript">
    window.notify = function () {
        alert('runned from opened window');
    };
    window.onload = function() {
        document.getElementById('button').addEventListener('click', function() {
            window.open('test.html');
        }, false);
    };
</script>
</head>
<body>
<button id="button">Open window</button>
</body>

打开的页面:
<html>
<head>
<script type="text/javascript">
    window.onload = function() {
        window.opener.notify()
    };
</script>
</head>
<body>
    Popup site
</body>
</html>

谢谢您的建议。但是,我不能(也不想)编辑我正在打开的目标网站! - mrmclovin

0

只需在 iframe 中添加此代码即可:

$(document,parent.document).ready(function(){
alert('Done');
});  

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