• javascript关于事件与闭包


    现状:IE9以及其他都是先DOM2级事件模块的核心部分。

    概念:事件流;描述的是从页面中接受事件的顺序,ie的事件流是事件冒泡流,Netscape的事件流是事件捕获流。标准指定者为了照顾,所以规定事件的执行是先捕获,后冒泡。

    1.事件执行顺序

    前提:DOM2级事件规定的事件流包括三个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段。

    捕获的思想是尽早接受到事件,

    响应:带有on前缀的事件监听器,onclick,onload

    注意:处于阶段是指最里层的目标元素,它的事件执行顺序按照绑定的顺序执行

    事件的委托:在一个复杂的web应用程序中,如果对很多元素的都进行获取id绑定事件,那将非常繁杂,利用委托可以简化:只需在DOM树中尽量最高的层次上添加一个

    事件处理如:

    只取一个dom元素,占用更少内存,更加简洁

    2.阻止事件冒泡,事件流阻止,取消事件的默认行为,和事件函数的接触绑定

    事件对象是否可以取消,要通过Event.cancelable属性表示。

    事件监听器可以调用Event.preventDefault()取消事件对象的默认动作(如果在IE下,Event.returnValue = false就可以;如果是非IE下,用Event.preventDefault()阻止。)。Event.stopPropagation()方法可以阻止事件向上冒泡。

    Event.preventDefault()和Event.stopPropagation(),前者是通知浏览器不要执行与事件相关联的默认动作,比如submit类型的按钮点击会提交;后者是停止事件流的继续冒泡,但是它对IE8及以下IE浏览器支持不好。如果直接使用return false则表示终止处理函数。

    另外stopPropagation 可以阻止事件在元素之间进一步传播,但是不能阻止事件函数在本元素内的执行(也就是A元素中的绑定事件会执行,但是a的子集或者父级元素不会在执行了);但是stopImmediatePropagation会一并阻止。

     setCapture 和 releaseCapture

    这两个是 IE 下的事件绑定函数,只要我们在某个元素上 setCapture 了,那么你在任何地方的鼠标操作(mouseXXX之类的动作)都会在这个元素上触发(前提是你在这个元素上绑定了事件),releaseCapture 或者本窗口失去聚焦才会释放这个绑定~

    事件解绑

    原生JS绑定则对应运行removeEventListener()和detachEvent()

     var EventUtil = { 
          //注册 
          addHandler: function(element, type, handler){ 
            if (element.addEventListener){ 
              element.addEventListener(type, handler, false); 
            } else if (element.attachEvent){ 
              element.attachEvent("on" + type, handler); 
            } else { 
              element["on" + type] = handler; 
            } 
          }, 
          //移除注册 
          removeHandler: function(element, type, handler){ 
            if (element.removeEventListener){ 
                    element.removeEventListener(type, handler, false); 
            } else if (element.detachEvent){ 
                    element.detachEvent("on" + type, handler); 
            } else { 
                    element["on" + type] = null; 
            } 
          }              
         }; 

    3.jquery中的事件

     绑定事件:

    .bind()  .delegate() 他们背后都是使用on的方式进行绑定,但是单独使用on的方式可能会出错

    实例:


    $("#div1").bind('click',function(e){ alert("div1 " + e.currentTarget.name); }); //jQuery这些事件委托的原理根据事件冒泡的机制,广播的时候所有的节点都会知道,到底发生了什么。
    $(
    "body").delegate('#div1','click',function(e){ alert("div1"); }); $("body").delegate('#div2','click',function(e){ alert("div2");

     参考:http://www.cnblogs.com/hustskyking/p/problem-javascript-event.html

    http://kb.cnblogs.com/page/199251/

  • 相关阅读:
    关于php的变量类型以及数据类型的转换
    关于mysql的个人理解
    关于sql的的数据操作
    关于数据库的安装,使用以及数据表的创建,修改,查询属性
    关于计算器,全选全不选试题
    Reverse proxy
    网站统计IP PV UV
    Android屏幕适配全攻略
    Android中android.graphics下面的绘制图形类Canvas,Paint,Bitmap,Drawable
    Android项目中导入support v4和v7
  • 原文地址:https://www.cnblogs.com/wanglao/p/3569701.html
Copyright © 2020-2023  润新知