事件对象

当对某个元素进行某个事件的触发,浏览器会把该事件触发后的详情信息包装成对象传到函数中。

  1. var oDiv = document.getElementsByClassName("wrapper")[0];
  2. oDiv.onclick = function (event) {
  3. var event = event || window.event;
  4. console.log(event);
  5. };

event对象中有个属性可以获取到事件触发的源对象。

  1. var oDiv = document.getElementsByClassName("wrapper")[0];
  2. oDiv.onclick = function (event) {
  3. var event = event || window.event;
  4. // srcElement、target 就是事件源对象
  5. // 火狐只有 target ,IE只有 srcElement
  6. var target = event.target || target.srcElement;
  7. console.log(target); // <div></div>
  8. };

事件委托

什么是事件委托呢?
事件委托就是事件交给其他元素去触发。
在以往的li列表点击事件的时候,我们需要给li的每一个元素都去绑定事件,这样极大的消耗性能。

  1. var oUl = document.getElementsByTagName("ul")[0],
  2. oLi = document.getElementsByTagName("li"),
  3. length = oLi.length,
  4. item;
  5. for (var i = 0; i < length; i++) {
  6. item = oLi[i];
  7. item.onclick = function () {
  8. console.log(this.innerText);
  9. };
  10. }

而事件委托就可以利用「事件冒泡」的原理去让ul绑定点击事件。

  1. var oUl = document.getElementsByTagName("ul")[0],
  2. oLi = document.getElementsByTagName("li"),
  3. length = oLi.length,
  4. item;
  5. oUl.addEventListener("click", function (event) {
  6. var event = event || window.event;
  7. // 真正的事件源是 li
  8. if (event.target.nodeName === "LI") {
  9. console.log(event.target.innerText);
  10. // 类数组不能使用数组的方法,可以继承 Array.prototype.index 后就可以查找 li 的下标
  11. console.log(Array.prototype.indexOf.call(oLi, event.target));
  12. }
  13. }, false);