js事件详解

事件详解

事件的触发一般有三个阶段,事件捕获、目标事件、事件冒泡。

1. 事件绑定

事件绑定:即需要对操作动作做出响应。基本绑定有三种方式。

  1. 嵌入DOM,给dom直接增加事件函数。

      <button onclick="open()">按钮</button><button onclick="clickFn()">按钮</button>
     <script>
     	function clickFn(){
     	    alert('你已经点击了按钮‘);
     	}
     </script>
    
  2. 获取到dom元素后,对dom元素增加可点击事件属性,动态绑定

     document.getElementById('btn').onclick = function(){    alert( '点击了按钮') }
    
  3. 监听事件,

     document.getElementById('btn').addEventListener('click',function(){
     		alert("点击了按钮")
     })//老ie下通过 attachEvent进行监听
    

以上三种方式均可以对元素绑定指定事件。

事件冒泡

当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,直到传到window。但是只是传递事件,对应的处理函数是不传递的。如果父级没有对应的处理函数,则没有任何表现,大多数情况下是取消事件冒泡,
取消冒泡的方式

  1. 非ie e.stopPropagation()
  2. ie下使用 e.cancelBubble=true

事件委托

事件委托的实现原理其实就是事件冒泡,父级可以捕捉到子元素的事件。更多的使用到ul及li上,需要给对应的每个li绑定上事件时,可以将事件绑定到父级ul上。
使用事件委托技术可以避免对特定的每个节点添加事件监听器,相反,事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。
例如:

	document.getElementsByTagName("ul")[0].addEventListener('click',function(e){
			var e = e || window.e; 
			var target  = e.target ||  e.srcElement; //以上两句都是为了兼容浏览器
			alert("点击的内容是:"+target.innerHTML);
	});

这里点击li会弹出每个对应li里的内容。

jQuery中事件的绑定。

jQuery中事件的绑定有多种方式, 比如 bind 、 on 、 live 、one (一次性执行函数)、 delegate几种。
对应的解绑定也有多种 unbind、off、die、 undelegate
接下来对这几种绑定方式详细的说明下。

  1. one 属于一次性绑定事件,执行一次后再次点击则不生效。

  2. bind 是直接绑定在元素上,只能对已经存在的元素绑定事件,对未来元素不友好,不能自动为未来元素增加事件。
    具体使用方法如下:$("#"+id).bind(type,[data],fn);

    $(’#btn’).bind(“click”, function(){
    alert(“按钮触发点击事件”);
    });

    解绑函数为 .unbind(type,data);不加参数为移除所有的类型的事件,只有type参数时为移除type类型的所有事件,存在两个参数时,为移除type类型的下data数组里的事件。

  3. live绑定利用了事件冒泡的原理,使用事件委托的方式绑定事件,live方法并没有将监听器绑定到自己(this)身上,而是绑定到了document身上。
    具体使用方法 :$(’#’+id).live(type, [data], fn)
    $(’#myol li’).live(‘click’,getHtml); 给ul下li绑定具体事件。
    解绑函数为 .die(type,data);使用方式同unbind;

  4. delegate和live相似,但由于live将事件委托给了document,使得document比较厚重,这时边增加了delegate,用于解决这个问题
    具体使用方法:$(’#’+id).delegate(object,type, [data], fn) //这里的object为目标触发事件
    $(’#ul’).delegate(‘li’,‘click’,function(){ alert(‘click’)});
    解绑函数为 .undelegate(type,data);使用方式同unbind;

  5. on 其实以上几种绑定的方式最终都会调用on ,
    具体使用方式如下:$(’#’+id).on(type,[selector],[data],fn)
    例子: $(’#ul li’).on(‘click’,function(){});
    解绑函数为 .off(type,data);使用方式同unbind;

结论:

  • bind()函数只能针对已经存在的元素进行事件的设置;但是live(),on(),delegate()均支持对未来新添加元素 的事件设置;
  • .bind()支持Jquery所有版本;live()支持jquery1.8-;delegate()支持jquery1.4.2+;on()支持jquery1.7+;bind()函数在jquery1.7版本以前比较受推崇,1.7版本出来之后,官方已经不推荐用bind(),替代函数为on(),这也是1.7版本新添加的函数,同样,可以用来代替live()函数,live()函数在1.9版本已经删除;
  • .live()函数和delegate()函数两者类似,但是live()函数在执行速度,灵活性和CSS选择器支持方面较delegate()差些;

使用心得:

  1. 用.bind()的代价是非常大的,它会把相同的一个事件处理程序hook到所有匹配的DOM元素上。
  2. 不要再用.live()了,它已经不再被推荐了。它使得document太过厚重。
  3. delegate()会提供很好的方法来提高效率,同时我们可以添加到动态创建的元素上。
  4. on()是整合了之前的3种方式的新事件绑定机制,我们可以用.on()来代替上述的3种方法。

如果觉着不错,可以关注我的公众号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值