Javascript检测关闭弹出窗口加载另一个域

2023-10-01前端开发问题
7

本文介绍了Javascript检测关闭弹出窗口加载另一个域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我正在打开一个弹出窗口并将 onbeforeunload 事件附加到它,如下所示:

I am opening a popup window and attaching an onbeforeunload event to it like this:

win = window.open("http://www.google.com", "", "width=300px,height=300px");
win.onbeforeunload = function() {
    //do your stuff here
    alert("Closed");
};

如果我将 URL 留空,新的弹出窗口会以about:blank"作为地址打开,但当我关闭它时,我会看到警报.

If I leave the URL empty, the new popup opens with "about:blank" as the address but when I close it, I see the alert.

如果我按照您看到的方式打开(使用外部 URL),一旦关闭,我将无法再看到警报.知道为什么会这样吗?

If I open in as you see it (with an external URL), once it's closed, I cannot see the alert anymore. Any idea why this is happening?

推荐答案

如前所述,同源策略阻止 Javascript 检测此类事件.但是有一个非常简单的解决方案可以让您检测此类窗口的关闭.

As mentioned, same origin policy prevents Javascript from detecting such events. But there's a quite simple solution which allows you to detect closure of such windows.

这是 JS 代码:

var openDialog = function(uri, name, options, closeCallback) {
    var win = window.open(uri, name, options);
    var interval = window.setInterval(function() {
        try {
            if (win == null || win.closed) {
                window.clearInterval(interval);
                closeCallback(win);
            }
        }
        catch (e) {
        }
    }, 1000);
    return win;
};

它的作用:它使用提供的参数创建新窗口,然后以 1s 的间隔设置检查器功能.然后该函数检查窗口对象是否存在并将其关闭属性设置为 false.如果其中任何一个不正确,这意味着窗口(可能)已关闭,我们应该触发closeCallback 函数"回调.

What it does: it creates new window with provided parameters and then sets the checker function with 1s interval. The function then checks if the window object is present and has its closed property set to false. If either ot these is not true, this means, that the window is (probably) closed and we should fire the 'closeCallback function' callback.

此功能应适用于所有现代浏览器.前段时间 Opera 在从其他域的窗口检查属性时导致错误 - 因此 try..catch 块.但是我现在已经测试过了,它似乎工作得很好.

This function should work with all modern browsers. Some time ago Opera caused errors when checking properties from windows on other domains - thus the try..catch block. But I've tested it now and it seems it works quite ok.

我们使用这种技术为不通过 SDK 支持的网站创建facebook 风格"的登录弹出窗口(ehem...Twitter...ehem).这需要一些额外的工作——我们无法从 Twitter 本身获得任何消息,但是 Oauth 将我们重定向回我们的域,然后我们能够将一些数据放入可从开启程序访问的弹出窗口对象中.然后在关闭回调函数中,我们解析这些数据并呈现实际结果.

We used this technique to create 'facebook-style' login popups for sites which doesn't support them via SDK (ehem... Twitter... ehem). This required a little bit of extra work - we couldn't get any message from Twitter itself, but the Oauth redireced us back to our domain, and then we were able to put some data in popup window object which were accessible from the opener. Then in the close callback function we parsed those data and presented the actual results.

此方法的一个缺点是在窗口关闭后调用回调.嗯,这是我能够通过跨域策略实现的最佳效果.

One drawback of this method is that the callback is invoked AFTER the window has been closed. Well, this is the best I was able to achieve with cross domain policies in place.

这篇关于Javascript检测关闭弹出窗口加载另一个域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

The End

相关推荐

js删除数组中指定元素的5种方法
在JavaScript中,我们有多种方法可以删除数组中的指定元素。以下给出了5种常见的方法并提供了相应的代码示例: 1.使用splice()方法: let array = [0, 1, 2, 3, 4, 5];let index = array.indexOf(2);if (index -1) { array.splice(index, 1);}// array = [0,...
2024-11-22 前端开发问题
182

JavaScript小数运算出现多位的解决办法
在开发JS过程中,会经常遇到两个小数相运算的情况,但是运算结果却与预期不同,调试一下发现计算结果竟然有那么长一串尾巴。如下图所示: 产生原因: JavaScript对小数运算会先转成二进制,运算完毕再转回十进制,过程中会有丢失,不过不是所有的小数间运算会...
2024-10-18 前端开发问题
301

JavaScript(js)文件字符串中丢失"\"斜线的解决方法
问题描述: 在javascript中引用js代码,然后导致反斜杠丢失,发现字符串中的所有\信息丢失。比如在js中引用input type=text onkeyup=value=value.replace(/[^\d]/g,) ,结果导致正则表达式中的\丢失。 问题原因: 该字符串含有\,javascript对字符串进行了转...
2024-10-17 前端开发问题
437

layui中table列表 增加属性 edit="date",不生效怎么办?
如果你想在 layui 的 table 列表中增加 edit=date 属性但不生效,可能是以下问题导致的: 1. 缺少日期组件的初始化 如果想在表格中使用日期组件,需要在页面中引入 layui 的日期组件,并初始化: script type="text/javascript" src="/layui/layui.js"/scrip...
2024-06-11 前端开发问题
455

Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript
Rails/Javascript: How to inject rails variables into (very) simple javascript(Rails/Javascript:如何将 rails 变量注入(非常)简单的 javascript)...
2024-04-20 前端开发问题
5

CoffeeScript 总是以匿名函数返回
CoffeeScript always returns in anonymous function(CoffeeScript 总是以匿名函数返回)...
2024-04-20 前端开发问题
13