前端知识填坑记(一):浏览器内核,事件委托

2018-09-29  本文已影响0人  小小的白菜

常用的浏览器内核。

.bind() .live() .delegate() .on()

·$("a").bind("click",function(){alert("ok");});
$("a").live("click",function(){alert("ok");});
$("#container").delegate("a","click",function(){alert("ok");})
差别

jQuery中.bind() .live() .delegate() .on()的区别

事件委托

onclickonmouseoveronmouseout等事件,利用冒泡的原理,把事件加到父级上,触发执行效果。

栗子
<ul id="ul">
  <li>aaaaaaaa</li>
  <li>bbbbbbbb</li>
  <li>cccccccc</li>
</ul>

window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");

  for(var i=0; i<aLi.length; i++){
    aLi[i].onmouseover = function(){
      this.style.background = "red";
    }
    aLi[i].onmouseout = function(){
      this.style.background = "";
    }
  }
}

但是如果说我们可能有很多个li用for循环的话就比较影响性能。

下面我们可以用事件委托的方式来实现这样的效果。

window.onload = function(){
  var oUl = document.getElementById("ul");
  var aLi = oUl.getElementsByTagName("li");

/*
这里要用到事件源:event 对象,事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。
ie:window.event.srcElement
标准下:event.target
nodeName:找到元素的标签名
*/
  oUl.onmouseover = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    //alert(target.innerHTML);
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "red";
    }
  }
  oUl.onmouseout = function(ev){
    var ev = ev || window.event;
    var target = ev.target || ev.srcElement;
    //alert(target.innerHTML);
    if(target.nodeName.toLowerCase() == "li"){
    target.style.background = "";
    }
  }
}

DOM的默认事件、事件模型、事件委托、阻止默认事件、冒泡事件的方式
[解惑]JavaScript事件机制
原生JavaScript事件详解

前端知识填坑记(二):call和apply,bind ,new

上一篇下一篇

猜你喜欢

热点阅读