zoukankan      html  css  js  c++  java
  • onbeforeunload的拦截与不拦截

        一般来说,用addListener的方式比直接用on的方式要好,因为用on会覆盖掉上一次同名的事件监听器,而addListener则会加一个。就好像是设计模式中的命令模式一样,每addListener一个监听器,就会把监听器push到一个数组中,触发事件时,会将数组中的所有事件依次触发出来。

         如果一个代码很复杂,或者由多人维护,用on的方式很容易产生冲突,所以一般情况下,都推荐使用addListener。但有一种情况比较特别——特意需要覆盖之前的监听器。

         举个例子说吧,有这样一个需求:一个页面内有很多链接,只要页面刷新或者是跳转到别的页面或者关闭当前页,都会弹出一个弹窗,询问是否确认离开,点击是才会接着执行,点击否不会执行。这个功能很多人都做过,很简单,监听window.onbeforeunload事件,event.returnValue为提示信息,就可以实现。
         可是,如果再加一个需求,页面中有某一个链接,点击不会进行拦截,而是直接跳转,又该怎么做呢?
         没错了,就是覆盖之前的window.onbeforeunload监听器,用一个空的执行函数代替。demo如下:
    ===============================================

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>阿当制作</title>
    </head>

    <body>
    <a href="http://www.google.cn">google</a>   <a href="http://www.baidu.com" id="test">百度</a>
    <script type="text/javascript">
        window.onbeforeunload = function(e){
            var e = e || window.event;
            e.returnValue = "您还没有保存";
        }
        var test = document.getElementById("test");
        test.onclick = function(){
            window.onbeforeunload = function(){};
        }
    </script>
    </body>
    </html>
    =================================================================
    点击google链接,或者刷新页面,或者关闭页面都会弹出弹窗,但是点击百度链接就会直接跳转了。
  • 相关阅读:
    简单的mvc之一:简单的开始
    从子类化到工厂模式
    js漫谈
    asp.net mvc框架的一些切入点
    js框架漫谈
    基于公司云平台的即时聊天工具PTALK
    基于公司云平台的素材归档系统(一)
    搜索输入框下拉列表热词搜索的实现
    HTML5 localStorage 的使用
    MVC模式下xml文件的解析
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426979.html
Copyright © 2011-2022 走看看