我有以下代码。它试图在第6行打开一个窗口。但它继续加载(在标题栏中显示处理窗口中的空白内容)。当我逐步调试调试器中的代码并在第10行完成第9行的执行时,窗口最终加载,给我错误
未捕获的TypeError:无法读取属性' 0'第9行的null。
我不明白为什么window.open()
没有立即在window.open()
上完成加载网页,以及为什么在我通过第9行时它总是完成加载。
var pageURL='url';
var w=500;
var h=500;
var left = (screen.width/2)-(w/2);
var top = (screen.height/2)-(h/2);
var targetWin = window.open (pageURL, "_blank",'toolbar=no, location=no,directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
var windowStr = targetWin.document.documentElement.innerHTML;
var divMatch = windowStr.match(/someregex/);
console.log(divMatch[0]);
在线阅读建议之后,我在第6行之后放下了以下内容,但行为相同!!!
targetWin.document.close();
这里发生了什么?我正在使用Chrome进行调试。
答案 0 :(得分:2)
我不明白为什么
window.open()
没有立即完成加载网页
这是因为window.open
asyncronous 。要获取窗口的内容,您需要等待它被加载。
来自MDN:
请注意,远程网址不会立即加载。当
window.open()
返回时,窗口始终包含about:blank
。 URL的实际提取是延迟的,并在当前脚本块完成执行后启动。窗口创建和引用资源的加载是异步完成的。
您可以等待load
事件:
var targetWin = window.open (...);
targetWin.addEventListener('load', function() {
// Continue doing stuff here.
});
或者,您可以等待DOMContentLoaded
事件。
另请注意,只有在尊重same-origin policy的情况下才能执行此操作。