Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将document.ready绑定到弹出窗口_Javascript_Jquery_Document Ready - Fatal编程技术网

Javascript 将document.ready绑定到弹出窗口

Javascript 将document.ready绑定到弹出窗口,javascript,jquery,document-ready,Javascript,Jquery,Document Ready,由于jQuery绑定document.ready事件的方式,应该简单的代码不是: var w = window.open(someSameOriginLocation,''); $(w).ready(function () { //alternatively selector could be $(w.document) console.log('popout ready'); }); 问题 回调在父窗口准备就绪时执行,而不是在子窗口准备就绪时执行 在回调中,此是对w.opener.do

由于jQuery绑定
document.ready
事件的方式,应该简单的代码不是:

var w = window.open(someSameOriginLocation,'');
$(w).ready(function () { //alternatively selector could be $(w.document)
  console.log('popout ready');
});
问题
  • 回调在父窗口准备就绪时执行,而不是在子窗口准备就绪时执行
  • 在回调
    中,此
    是对
    w.opener.document的引用

是否有一种相当简单的跨浏览器方式可以使用jQuery将
ready
事件(或类似事件)绑定到不同的窗口上下文?

JavaScript安全策略不允许这样做。例如,您得到控制台错误

Unsafe JavaScript attempt to access frame with URL http://www.example.com/ from frame with URL http://www.example.org/. Domains, protocols and ports must match.

在调用window.open和设置同一窗口的onload函数之间必须有一个暂停。在window.open调用之后立即调用该窗口没有属性。也许您必须重复使用setInterval(不要忘记clearInterval)
在JSFIDLE中试试这个(这是我最好的猜测)


JavaScript安全策略不允许这样做。例如,您得到控制台错误

Unsafe JavaScript attempt to access frame with URL http://www.example.com/ from frame with URL http://www.example.org/. Domains, protocols and ports must match.

在调用window.open和设置同一窗口的onload函数之间必须有一个暂停。在window.open调用之后立即调用该窗口没有属性。也许您必须重复使用setInterval(不要忘记clearInterval)
在JSFIDLE中试试这个(这是我最好的猜测)


大约5年前,当我问这个问题时,我还没有听说过承诺。jquery1.7最近发布了,而
延迟
在今年早些时候的1.5中引入了。这早于一年多后发布的
承诺/A+/
规范

我这么说是因为当时我无法识别jQuery的
$(document).ready(…)
是什么

它被绑定为一个事件,并将回调作为一个事件,而jQueryAPI将其视为一个事件,因此我错误地认为它是一个事件,尽管是一个特殊的事件

文档准备就绪不是一个事件这是一个承诺。

尽管如此,我的错误是试图跟随jQuery的脚步,创建一个奇特的事件,而我应该做的是使用承诺(更不用说它们在JS世界中还不存在)


综上所述,在现代浏览器中,在任何窗口引用上支持类似于
document.ready
的行为非常简单。我的时间优势在于,许多旧问题已被错误修复,新的浏览器功能(如
Promise
)大大减少了实现
就绪
功能的工作量

我对此问题的解决方案如下所示:

function ready(win) {
    return new Promise(function (resolve) {
        function checkReady() {
            if (win.document.readyState === 'complete') {
                resolve();
            }
        }

        win.document.addEventListener('DOMContentLoaded', checkReady, false);
        win.addEventListener('load', checkReady, false);
        checkReady();
    });
}
并可用作:

ready(window).then(function () {
  //...do stuff
});
或者,如果您使用的是
窗口。请打开

ready(open('/your/file.html', ...)).then(function () {
  //.../your/file.html is ready
});

大约5年前,当我问这个问题时,我还没有听说过承诺。jquery1.7最近发布了,而
延迟
在今年早些时候的1.5中引入了。这早于一年多后发布的
承诺/A+/
规范

我这么说是因为当时我无法识别jQuery的
$(document).ready(…)
是什么

它被绑定为一个事件,并将回调作为一个事件,而jQueryAPI将其视为一个事件,因此我错误地认为它是一个事件,尽管是一个特殊的事件

文档准备就绪不是一个事件这是一个承诺。

尽管如此,我的错误是试图跟随jQuery的脚步,创建一个奇特的事件,而我应该做的是使用承诺(更不用说它们在JS世界中还不存在)


综上所述,在现代浏览器中,在任何窗口引用上支持类似于
document.ready
的行为非常简单。我的时间优势在于,许多旧问题已被错误修复,新的浏览器功能(如
Promise
)大大减少了实现
就绪
功能的工作量

我对此问题的解决方案如下所示:

function ready(win) {
    return new Promise(function (resolve) {
        function checkReady() {
            if (win.document.readyState === 'complete') {
                resolve();
            }
        }

        win.document.addEventListener('DOMContentLoaded', checkReady, false);
        win.addEventListener('load', checkReady, false);
        checkReady();
    });
}
并可用作:

ready(window).then(function () {
  //...do stuff
});
或者,如果您使用的是
窗口。请打开

ready(open('/your/file.html', ...)).then(function () {
  //.../your/file.html is ready
});

可能使用jQuery.live函数和“load”event@HerrSerker,仅将事件绑定到活动的
文档
。我可以使用自定义绑定函数,如
$(w).popupready(fn),我只是试着不重新发明轮子。也许是用jQuery.live函数和“load”event@HerrSerker,仅将事件绑定到活动的
文档
。我可以使用自定义绑定函数,如
$(w).popupready(fn),我只是不想重新发明轮子。你需要复习一下你的安全沙盒知识。除了任何非内容页之外,页面还被授予访问同一域()的子页的权限。您不能将位置更改为
http://www.example.com/“
并期望它能起作用。我的示例代码运行良好(除了
ready
未绑定到正确的窗口上下文之外)。@zzzzBov您的代码没有运行,因为您没有加载任何页面。所以没有人会开枪。我不知道你在同一个领域。那你为什么不在加载的窗口中启动
$(document).ready
,然后依赖
window.opener.document
?你显然没有抓住问题的关键
window.open(“”,”)
可以是
window.open('foo.html')
,我希望父页面在加载的页面(空或不空)完全就绪时有一个回调。我一直在研究jQuery源代码,它看起来不太难创建我自己的泛型事件,我只是希望其他人已经有了。设置一个单一的<代码> OnLoad 事件远没有一个<>代码>文档的能力。准备好的/Cudio>在jQuery中调用。您所做的更改是猪上的口红。你没有改变脚本中的任何核心问题,事实上,由于你根本不了解