JS 传播事件、取消事件默认行为、阻止事件传播

1.事件处理程序的返回值  

      一般状况下,返回值false就是告诉浏览器不要执行这个事件相关的默认操做。例如,表单提交按钮的onclick事件处理程序能经过返回false阻止浏览器提交表单,再如a标签的onclick事件处理程序经过返回false阻止跳转href页面。相似地,若是用户输入不合适的字符,输入域上的onkeypress事件处理程序能经过返回false来过滤键盘输入。  
      事件处理程序的返回值只对经过属性注册的处理程序才有意义。 

2.调用顺序 

      文档元素或其余对象能够为指定事件类型注册多个事件处理程序。当适当的事件发生时,浏览器必须按照以下规则调用全部的事件处理程序:浏览器

  • 经过设置对象属性或HTML属性注册的处理程序一直优先调用。
  • 使用addEventListener()注册的处理程序按照它们的注册顺序调用。
  • 使用attachEvent()注册的处理程序可能按照任何顺序调用,因此代码不该该依赖于调用顺序。

3.事件传播 

  在调用在目标元素上注册的事件处理函数后,大部分事件会“冒泡”到DOM树根。调用目标的父元素的事件处理程序,而后调用在目标的祖父元素上注册的事件处理程序。这会一直到Document对象,最后到达Window对象。函数

  发生在文档元素上的大部分事件都会冒泡,值得注意的例外是focus、blur和scroll事件。文档元素的load事件会冒泡,但它会在Document对象上中止冒泡而不会传播到Window对象。只有当整个文档都加载完毕时才会触发Window对象的load事件。spa

4.取消事件默认行为、阻止事件传播  

      在支持addEventListener()的浏览器中,能够经过调用事件对象的preventDefault()方法取消事件的默认操做。IE9以前的IE中,能够经过设置事件对象的returnValue属性为false达到一样的效果。下面一段代码是结合三种技术取消事件: 
function cancelHandler(event){
    var event=event||window.event;//兼容IE
    
    //取消事件相关的默认行为
    if(event.preventDefault)    //标准技术
        event.preventDefault();
    if(event.returnValue)    //兼容IE9以前的IE
        event.returnValue=false;
    return false;    //用于处理使用对象属性注册的处理程序
}

 

   取消事件相关的默认操做只是事件取消中的一种,咱们也能取消事件传播。在支持addEventListener()的浏览器中,能够调用事件对象的stopPropagation()方法以阻止事件的继续传播。若是在同一对象上定义了其余处理程序,剩下的处理程序将依旧被调用,但调用stopPropagation()以后任何其余对象上的事件处理程序将不会被调用。
   IE9以前的IE不支持stopPropagation()方法,而是设置事件对象cancelBubble属性为true来实现阻止事件进一步传播

 

  来源于《JavaScript权威指南》 17.3.4code

相关文章
相关标签/搜索