javaScript绑定事件委托 demo

时间:2021-11-28 16:45:08

事件绑定通常发生在 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 可以取消事件冒泡

  }

}