Javascript 将document.ready绑定到弹出窗口
由于jQuery绑定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
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中调用。您所做的更改是猪上的口红。你没有改变脚本中的任何核心问题,事实上,由于你根本不了解