这是我要解决的问题:我再也不想再问我是否真的要关闭窗口了。不幸的是,有些人认为在onbeforeunload(或类似函数)中添加alert()以使他们的页面在屏幕上停留的时间更长是个好主意。

是否有可能永久地并且对于一切都阻止onbeforeunload开始重新定义?

例如,在Safari扩展内部,是否可以捕获对onbeforeunload的修改并阻止它?

最佳答案

看起来可以使用Object.defineProperty。您需要设法在要阻止该属性的所有网页的执行上下文中执行以下代码:

Object.defineProperty(window, 'onbeforeunload', {value: null});


在Chrome扩展程序中,您可以使用在<all_urls>all_framesdocument_start上运行的content script,并使用this answer中介绍的某些技术来使代码在以下代码的执行上下文中运行来实现页。对于Safari扩展程序,它应该大致相同。

请注意,页面仍可以使用beforeunload注册window.addEventListener处理程序。为了防止这种情况发生,您可以在前一行代码中添加以下内容:

(function() {
    var prevFunc = window.addEventListener;
    window.addEventListener = function( name ) {
        if( name !== 'beforeunload' )
            return prevFunc.apply(window, arguments);
    }
})();

10-05 20:53
查看更多