检测使用 window.open 打开的窗口的 onload 事件

IT技术 javascript internet-explorer firefox google-chrome popup
2021-01-24 02:29:33
 window.popup = window.open($(this).attr('href'), 'Ad', 'left=20,top=20,width=500,height=500,toolbar=1,resizable=0');
 $(window.popup).onload = function()
        {
                alert("Popup has loaded a page");
        };

这在我尝试过的任何浏览器(IE、Firefox、Chrome)中都不起作用。如何检测页面何时加载到窗口中(如 iframe onload)?

6个回答
var myPopup = window.open(...);
myPopup.addEventListener('load', myFunction, false);

如果您关心 IE,请改用以下内容作为第二行:

myPopup[myPopup.addEventListener ? 'addEventListener' : 'attachEvent'](
  (myPopup.attachEvent ? 'on' : '') + 'load', myFunction, false
);

正如你所看到的,支持IE是相当繁琐的,应该避免可能的话我的意思是,如果你因为你的观众需要支持 IE,那么一定要这样做。

我花了几个小时寻找解决方案,这是唯一对我有用的解决方案。需要注意的一件事是 Firefox 似乎在完全加载页面之前打开了打印对话框。这将导致打印空白页。我通过检测浏览器来解决这个问题,然后在需要时使用 onload 事件。这可能不是最好的方法,但它对我有用。这是我的代码:
2021-03-14 02:29:33
var w = window.open(targetUrl, "_blank"); w[w.addEventListener ? 'addEventListener' : 'attachEvent']( (w.attachEvent ? 'on' : '') + 'load', doPrint(w), false );
2021-03-20 02:29:33
无论如何我可以做这个跨域吗?
2021-03-31 02:29:33
然后只需使用第三个条件。我会添加它。
2021-04-04 02:29:33
不幸的是没有。出于安全原因,浏览器禁用跨域的 JavaScript 对象交互。
2021-04-06 02:29:33

如果弹出窗口的文档来自不同的域,这是不可能的。

2015 年 4 月更新:我错了:如果您拥有这两个域,window.postMessagemessage几乎可以当今所有相关的浏览器使用事件

如果没有,如果没有将文档加载到弹出窗口中的帮助,您仍然无法使这项工作跨浏览器工作。您需要能够检测弹出窗口加载后发生的更改,这可能是弹出页面中的 JavaScript 在处理自己的load事件时设置的变量,或者您是否可以对其进行一些控制您可以在 opener 中添加对函数的调用。

根据这篇文章stackoverflow.com/questions/25098021/...这是可能的,但您必须拥有这两个域。
2021-03-24 02:29:33
在 setTimeout() 调用中检查它以监视其他页面中 JS 函数的可用性的简单方法。
2021-03-30 02:29:33

检测使用 window.open 打开的窗口的 onload 事件所述,以下解决方案是理想的:

/* Internet Explorer will throw an error on one of the two statements, Firefox on the other one of the two. */
(function(ow) {
    ow.addEventListener("load", function() { alert("loaded"); }, false);
    ow.attachEvent("onload", function() { alert("loaded"); }, false);
})(window.open(prompt("Where are you going today?", location.href), "snapDown"));

如下所述,其他评论和答案犯下了几个错误的误解。

以下脚本演示了定义onload. 将脚本应用于正在打开的窗口的“快速加载”位置,例如具有该file:方案的位置,并将其与“慢”位置进行比较以查看问题:可能会看到onload消息或根本看不到消息(通过重新加载加载的页面可以看到所有 3 个变体)。还假设正在加载的页面本身没有定义一个onload会使问题复杂化的事件。

onload定义显然不是“里面弹出文档标记”:

var popup = window.open(location.href, "snapDown");
popup.onload = function() { alert("message one"); };
alert("message 1 maybe too soon\n" + popup.onload);
popup.onload = function() { alert("message two"); };
alert("message 2 maybe too late\n" + popup.onload);

你可以做什么:

  • 打开一个带有“外部”URL 的窗口
  • 在该窗口的地址栏上输入一个javascript:URI——该代码将以与“外国”URL 的域相同的权限运行如果在地址栏中键入它没有效果,则可能需要
    javascript:URI 加入书签(可能是这种情况2012 年左右发布的一些浏览器)

因此,几乎任何页面,无论其来源如何,都可以修改为:

if(confirm("wipe out links & anchors?\n" + document.body.innerHTML))
    void(document.body.innerHTML=document.body.innerHTML.replace(/<a /g,"< a "))

嗯,差不多:

jar:file:///usr/lib/firefox/omni.ja!/chrome/toolkit/content/global/aboutSupport.xhtml, Mozilla Firefox 的故障排除页面和其他 Jar 存档是例外。

再举一个例子,要定期禁用 Google 篡夺目标点击,请rwt使用以下 URI更改其功能:

javascript: void(rwt = function(unusurpURL) { return unusurpURL; })

(可选地将上述内容添加为例如“Spay Google”(“中和 Google”?)

然后在单击任何 Google 命中之前单击此书签,因此任何这些命中的书签都是干净的,而不是 Google 对它们造成的杂种变态畸变。

使用Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0UA 字符串完成的测试

需要注意的是,addEventListener在 Firefox 中只有一个非标准的第四个布尔参数,它true允许为外部页面实例化不受信任的内容触发器。

参考:
element.addEventListener | 文档对象模型 (DOM) | MDN:
特权和非特权页面之间的交互| 代码片段 | MDN:

引用的答案是share对这个问题的已发布答案的直接链接 - 最好......完成!...
2021-03-12 02:29:33
你的写作风格很难读。我的大脑在试图辨别这个答案中的含义时受伤了。简洁并不是坏事。
2021-03-12 02:29:33
这个答案中有很多句子说的是一件事,然后是另一句话来纠正前面的事情。这导致它很难遵循。这里有很好的信息,只是很难看到。说得更清楚,你会得到更多的赞成。
2021-03-28 02:29:33
upvotes 本身不是问题 - 混淆?希望没有什么是直接矛盾的——“误解的实施”是指以前关于 x-site 脚本和起源政策的评论和答案,希望不是这个答案!- 希望通过运行功能代码示例的经验证据更简洁和准确地限定和验证散文 - owØW¯¯ indow或者应该说是function(ouch),在参考了未经处理的错误条件在第1例双关语!)的散文是相当尖锐的,如果写疼,然后阅读它...!
2021-04-06 02:29:33
此外,如果这个问题是由另一个问题回答的,也许值得将其标记为另一个问题的副本,并在评论中将提问者引导到另一个问题。
2021-04-10 02:29:33

这对我有用;完整示例:

HTML:

<a href="/my-popup.php" class="import">Click for my popup on same domain</a>

Javascript:

(function(){
    var doc = document;

    jQuery('.import').click(function(e){
        e.preventDefault();
        window.popup = window.open(jQuery(this).attr('href'), 'importwindow', 'width=500, height=200, top=100, left=200, toolbar=1');

        window.popup.onload = function() {
            window.popup.onbeforeunload = function(){
                doc.location.reload(true); //will refresh page after popup close
            }
        }
    });
})();
应该说这仅在域相同时才有效
2021-03-23 02:29:33

onload事件处理程序必须在弹出窗口的 HTML<body>标记内。

这是我触发它的唯一方法,尝试了几乎所有其他可能的方法 - 谢谢。$(popup).find('body').attr('onload', 'window.print();');最后工作。
2021-03-18 02:29:33