onbeforeunload支持检测

时间:2020-03-06 14:59:13  来源:igfitidea点击:

我想检查当前的浏览器是否支持onbeforeunload事件。
通用的javascript方法似乎无法正常工作:

if (window.onbeforeunload) {
    alert('yes');
}
else {
    alert('no');
}

实际上,它仅检查事件是否已添加了某些处理程序。
有没有一种方法可以在不检测特定浏览器名称的情况下检测是否支持onbeforeunload?

解决方案

最好手动找出哪些浏览器支持它,然后让条件更像:

if( $.browser.msie ) {
  alert( 'no' );
}

...等等。

$ .browser.msie是jQuery语法,大多数框架具有相似的内置函数,因为它们在内部使用了很多。如果我们不使用框架,则建议我们看一下jQuery对这些功能的实现。

不同的方法,得到typeof

if(typeof window.onbeforeunload == 'function')

{
alert("hello functionality!");
}

alert('onbeforeunload' in window);

如果" onbeforeunload"是" window"的属性(即使它为null),则发出" true"警报。

这应该做同样的事情:

var supportsOnbeforeunload = false;
for (var prop in window) {
    if (prop === 'onbeforeunload') {
    supportsOnbeforeunload = true;
    break;
    }
}
alert(supportsOnbeforeunload);

最后:

alert(typeof window.onbeforeunload != 'undefined');

同样,即使当前的值为" null"," typeof window.onbeforeunload"也似乎是"对象",因此可以正常工作。

地壳

DOM-Events规范中未定义" beforeunload",这是IE特定的功能。我认为它是为了使执行能够在标准"卸载"事件之前被触发而创建的。在其他IE浏览器中,我们可以利用捕获阶段的"卸载"事件侦听器,从而在例如内联主体onunload事件之前执行代码。

此外,DOM不提供任何接口来测试其对特定事件的支持,我们只能测试对事件组(MouseEvents,MutationEvents等)的支持。

同时,我们也可以参考DOM事件规范http://www.w3.org/TR/DOM-Level-3-Events/events.html(不幸的是,IE中不支持)

希望这些信息对我们有所帮助

FF还支持onbeforeunload,因此对浏览器进行测试将无济于事。

前一段时间,我写了一篇关于在现代浏览器中检测事件支持的或者多或者少可靠的推论。我们可以在演示页上看到,至少Safari 4 +,FF3.x +和IE支持" beforeunload"。

编辑:现在,此技术已在jQuery,Prototype.js,Modernizr和其他可能的脚本和库中使用。

我意识到我在这个问题上有点迟了,但是我现在正在处理这个问题,并且我认为像下面这样的事情会更容易并且更可靠。这是特定于jQuery的,但它应与允许我们绑定和取消绑定事件的任何系统一起使用。

$(window).bind('unload', function(){
    alert('unload event');
});

window.onbeforeunload = function(){
    $(window).unbind('unload');
    return 'beforeunload event';
}

如果beforeunload事件被触发,这应该解除对unload事件的绑定。否则,它将仅触发卸载。