javaScript绑定事件委托 demo

事件绑定通常发生在 onload 或 DOMContentReady , 事件绑定占用 处理时间 占用内存, 而且不是每个事件都会被 点击执行。

由此 事件委托 可以优化事件绑定行为、。

事件逐层冒泡 直到被父级元素捕获。 事件代理  给外层元素绑定一个处理事件, 就可以处理子元素上出发所有事件。

DOM 标准 事件三个阶段:

捕获

到达目标、

冒泡

IE 不支持捕获, 但冒泡够用了。

event.currentTarget 事件处理程序当前正在处理事件的那个元素

event.target 事件真正的目标

event.type 出发事件类型 // click mouseover mouseout

 

this 始终等于currentTarget, 而 target 则只包含事件的 实际目标

var btn = document.getElementById('myBtn');

     btn.onclick = function ( event ) {

    alert( event.currentTarget === this );  //true

    alert( event.target == this  );  // true

     }

 

//如果事件处理程序 存在 按钮的父节点中  这些值 不同

document.body.onclick = function ( event ) {

  alert( event.currentTarget === document.body ); // true;

  alert( this === document.body );// true

 

  alert( event.target === document.getElementById( 'myBtn') ); //true;

 

}

 

 

 

例如:

<body>

<div> <a href="">btn</a></div>

<div> <a href="" id="doSomething">btn</a></div>

<div> <a href="" id="goWhere">btn</a></div>

</body>

-----------------------------------------------

document.getElementByTagName('body').onclick = function (e) {

  //浏览器 target

     e = e || window.event;

    var target = e.target || e.srcElement;

   if ( target.nodeName !== 'A'){ return;  }

  if (target.id == 'doSomething') {

    alert('doSomething');

      } else if (target.id == 'goWhere') {

    alert('goWhere');

  } else {

    alert('other A click');

  }

  if (typeof e.preventDefault === 'function') {

    e.preventDefault();

    e.stopPropagation();

     } else {

    e.returnValue = false;//IE 默认true false 取消事件的默认行为

           e.cancelBubble = true;//IE 默认false, 但设置true 可以取消事件冒泡

  }

}

 

posted @ 2016-07-06 09:14  参天树  阅读(171)  评论(0编辑  收藏  举报