3

我正在使用 Javascript 打开一个空白窗口,用最低限度填充它并注入一个脚本标记以包含 JQuery,但窗口属性 readyState 永远不会超过加载,因此 JQuery 永远不会触发。这是jsFiddle 上的演示。我不明白为什么弹出窗口没有更新它的 readyState。

var popup = window.open("", "popup", "height=500,width=700");
var doc = popup.document;
doc.write("<!doctype html><html><head></head><body></body></html>");
var script = doc.createElement("script");
script.type = "text/javascript";
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js";
script.onload = function() {
  console.log(doc.readyState);
  popup.$(document).ready(function() {
    console.log(doc.readyState);
  });
}
doc.getElementsByTagName("head")[0].appendChild(script);

这是没有 JQuery 的类似代码——readyState 窗口属性的相同问题永远不会超出“加载”。

var popup = window.open("", "popup", "height=500,width=700");
var doc = popup.document;
doc.write("<!doctype html><html><head></head><body></body></html>");
console.log(doc.readyState);
4

2 回答 2

6

如果您从不设置 URL,则就绪状态不会改变。它将被“初始化”或“加载” - 取决于您的浏览器。您可以通过在弹出窗口的控制台窗口中设置 document.location 来查看此更新,如下所示:

console.log(document.readyState);
document.location = "http://yourdomain.com";
console.log(document.readyState);

如果您将位置发送到域以外的域,则您将没有安全性来修改窗口对象。解决此问题的一种方法是使用 iframe 并设置源 - 如下所示:

var nw = window.open('', "MyWindowID", "fullscreen=no, toolbar=no, menubar=no,status=no,location=no");
var html = '<iframe id="document-{aid}" style="width:100%;height:100%;" src="http://www.google.com"></iframe>';
nw.document.write(html);
nw.focus();

请参阅:https ://stackoverflow.com/a/1443839/1220302

关于这一点的注意事项是尝试将您的弹出窗口包装在 $(popup) 中并挂钩 ready 事件。

这应该适合你:

var popup = window.open("", "popup", "height=500,width=700");
var doc = popup.document;
doc.write("<!doctype html><html><head></head><body></body></html>");
var script = doc.createElement("script");
script.type = "text/javascript";
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js";    
$(popup).ready(function(){
    console.log('loaded');
});
于 2012-07-12T14:31:10.350 回答
1

因为没有指向 的 url popup,所以它立即准备好了。命令完成后使用 jQuery 对其“准备就绪”的任何分配window.open都变得无关紧要。它永远不会开火,因为已经太晚了。

于 2012-07-12T14:00:18.323 回答