我遇到过一个奇怪的情况,如果实际窗口已经在屏幕上,window.open()不会触发'load'事件。
概要
我有一个按钮,当点击时运行一些JavaScript并在新窗口中打开一个页面。任何JS开发人员都看到的标准代码。当调用方法(较大类的一部分)时,它会检查它是否具有对窗口的引用(this.preview_window)。如果是这样,它将运行this.up,它将尝试再次打开它。一旦打开,它就会在该窗口上运行更新方法。
问题
如果窗口不存在,则一切都按预期运行。如果窗口确实存在但类没有对它的引用,则使用window.open()成功获取引用,但是不会调用更新函数。
相关代码
// This code is run whenever there is no reference to the window
this.preview_window = window.open('/folder/page.php','page_previewer');
Event.observe(this.preview_window, 'load',this.update.bindAsEventListener(this));
其余的代码已经过大量测试,因此我非常有信心我错过了load事件的工作方式。 window.open()和update()函数在所有情况下都按预期运行,但是这个函数。
答案 0 :(得分:1)
我猜测绑定发生时子窗口位于不同的域中,或者在加载发生之前从缓存加载。尝试将绑定设置为500毫秒超时。如果您控制子窗口的URL,则更容易从子窗口调用父窗口。或者关闭&重新打开。
if (this.preview_window && !this.preview_window.closed)
this.preview_window.close();
... open window ...
答案 1 :(得分:1)
我对此进行了一些实验,似乎问题是前面的答案所暗示的 - 如果你已经打开一个窗口,那么对window.open()的调用将不会触发load事件。因此,每次调用按钮的事件处理程序时,您基本上都需要刷新预览窗口,以确保将触发load事件,因此也可以调用更新处理程序。以下是我用来演示此代码的代码:
var preview_window;
function openPreviewWindow() {
if (preview_window) {
preview_window.close(); //Load will not fire unless we close the window first
}
preview_window = window.open('/', 'preview_window');
Event.observe(preview_window, 'load', function () {
alert('Updating opened window.');
}.bindAsEventListener(this));
}
<a href="#" onclick="openPreviewWindow()">Open Preview Window</a>
这可能不是非常有启发性,但希望它能让你走上更有希望的道路。