js 事件冒泡与事件捕获

一、事件冒泡

事件冒泡是指在事件发生过程中先从目标节点开始执行,并一层一层的相父节点依次查询直到document,并执行相同事件的过程。

 btn1.addEventListener(‘click‘,function(e){
        //true 为事件捕获,false 为事件冒泡
        //false为默认方式,冒泡方式执行
        //点击btn1时,如果是事件冒泡,则先执行btn1上的click事件,然后执行父元素div1上的click事件
        //如果是事件捕获,则先执行父元素上的click事件,然后执行btn1上的click事件
        var e= e||window.event;
        alert(‘你点击了btn1‘);
    },false);
div1.addEventListener(‘click‘,function(e){

alert(‘你点击了div1‘);},false);
 

这样的写法,当你点击btn1的时候,先弹出“你点击了btn1”,然后弹出“你点击了div1”;

二、事件捕获

事件捕获就是在事件发生过程中,先从document开始执行相同的事件,依次一层一层查找到目标节点,然后执行相同的事件。

btn1.addEventListener(‘click‘,function(e){
        //true 为事件捕获,false 为事件冒泡
        //false为默认方式,冒泡方式执行
        //点击btn1时,如果是事件冒泡,则先执行btn1上的click事件,然后执行父元素上的click事件
        //如果是事件捕获,则先执行父元素上的click事件,然后执行btn1上的click事件
        var e= e||window.event;
        alert(‘你点击了btn1‘);
    },true);

    div1.addEventListener(‘click‘,function(e){

        alert(‘你点击了div1‘);
    },true);

这样的写法,当你点击btn1的时候,先弹出“你点击了div1”,然后弹出“你点击了btn1”;

三、阻止事件冒泡和事件捕获

在阻止事件冒泡和捕获方式上,IE和其他浏览器不同;

首先是event的不同;

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

事件通常与函数结合使用,函数不会在事件发生前被执行!

在IE中输出的event 为 event;event在IE中为全局函数,可以在任何地方调用。

在FF中输出的为event; 在FF中只能在实践中调用,把event作为参数传进函数内

其他浏览器  则为二者都可以;

所以在确定event的时候需要进行浏览器兼容

 var e = event||window.event;

等同于 e = e?event:window.event;

通过这种方法,IE识别event,其他浏览器识别window.event;

在阻止事件方法上也有不同

IE:e.cancelBubble = true; 通过把e.cancelBubble设置为true,来阻止事件分发;

标准浏览器:e.stopPropagation();  标准浏览器的stopPropagation 方法可以设置不再派发事件。

兼容代码如下:

    var e = event||window.event;
        if(e.stopPropagation){
            e.stopPropagation();//标准浏览器
        }else{
            e.cancelBubble = true;//IE浏览器
        }

四、事件委托方法依托事件冒泡机制

传统事件绑定

我们给每一个li绑定点击之后背景颜色变红的事件;

var uli = document.getElementById(‘uli‘);
    var lis = uli.getElementsByTagName(‘li‘);
    for (var i = 0;i<lis.length;i++){
        lis[i].onclick = function(){
           this.style.backgroundColor = ‘red‘;
        }
    }
    //这样我们就可以做到li上面添加鼠标事件。
    //但是如果说我们可能有很多个li用for循环的话就比较影响性能。

一个事件委托实例

html不变,只更改事件绑定的方法

 var uli = document.getElementById(‘uli‘);
    uli.addEventListener(‘click‘,function(event){
        var e = event||window.event;

        var target = e.target||e.srcElement;//该方法用于查询发生event事件的具体节点。
        //e.target  是标准浏览器的方法
        //e.srcElement 是IE中的方法
        if (target.nodeName.toUpperCase()==‘LI‘){
            target.style.backgroundColor = ‘red‘;
        }
    });

标准浏览器查询event节点的方法是:window.event.target;

IE浏览器查询event节点的方法是:event.srcElement;

这样的写法可以在点击li的时候向上冒泡至ul,然后执行ul上的绑定事件,这样就不用给每个li都绑定一个点击事件.

而且新添加的li元素也可以绑定这样的事件,不用重新绑定

可以用removeElementListener 来取消绑定的事件函数

五、绑定事件监听方法

传统绑定事件

on + click、mouseover、keyup 等

传统绑定的

优点

  • 非常简单和稳定,可以确保它在你使用的不同浏览器中运作一致
  • 处理事件时,this关键字引用的是当前元素,这很有帮助

缺点

绑定同样事件的多个函数会覆盖,只能触发最后一种。

uli.onclick = function(){

  alert(‘1‘);

}

uli.onclick = function(){

  alert(‘2‘);

}

这样的写法执行时只能执行alert(‘2‘);   解除绑定用 uli.onclick = null;

W3C绑定事件

uli.addEventListener(‘click‘,function(){.........},false);

  1. W3C绑定的优点

    • 该方法同时支持事件处理的捕获和冒泡阶段。事件阶段取决于addEventListener最后的参数设置:false (冒泡) 或 true (捕获)。
    • 在事件处理函数内部,this关键字引用当前元素。
    • 事件对象总是可以通过处理函数的第一个参数(e)捕获。
    • 可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件
  2. W3C绑定的缺点
    • IE不支持,你必须使用IE的attachEvent函数替代。

解除绑定用 removeEventListener(‘click‘,fucntion(){.........});

IE绑定事件

IE用attachEvent方法绑定事件

element.attachEvent(‘onclick‘, function(){
        // ...
    });
  1. IE方式的优点

    • 可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件。
  2. IE方式的缺点
    • IE仅支持事件捕获的冒泡阶段
    • 事件监听函数内的this关键字指向了window对象,而不是当前元素(IE的一个巨大缺点)
    • 事件对象仅存在与window.event参数中
    • 事件必须以ontype的形式命名,比如,onclick而非click
    • 仅IE可用。你必须在非IE浏览器中使用W3C的addEventListene

解除绑定函数用 detachEvent(‘onclick‘,fucntion(){})

时间: 2024-10-10 02:55:40

js 事件冒泡与事件捕获的相关文章

JS事件(事件冒泡和事件捕获)

事件流:描述的是在页面中接收事件的顺序 事件冒泡:由最具体的元素接收,然后逐级向上传播至最不具体的元素的节点(文档) 事件捕获:最不具体的节点先接收事件,而最具体的节点应该是最后接收事件 DOM中:用于处理指定和删除事件处理程序的操作addEventListener()和removeEventListener().他们都接收三个参数:要处理的事件名.作为事件处理程序的函数和布尔值(事件处理的时候)[true:事件捕获时;false:事件冒泡时] DOM中的事件对象: type属性 用于获取事件类

JS中的事件绑定,事件捕获,事件冒泡以及事件委托,兼容IE

转载请注明出处:http://www.cnblogs.com/zhangmingze/p/4864367.html ● 事件分为三个阶段:   事件捕获 -->  事件目标 -->  事件冒泡 ● 事件捕获:事件发生时(onclick,onmouseover--)首先发生在document上,然后依次传递给body.……最后到达目的节点(即事件目标). ● 事件冒泡:事件到达事件目标之后不会结束,会逐层向上冒泡,直至document对象,跟事件捕获相反 1.onlick -->事件冒泡,

彻底弄懂JS的事件冒泡和事件捕获

先上结论:在事件执行流中有两种执行方式.一种是事件冒泡(即事件的执行顺序是从下往上执行的) ;  另一种是捕获(即事件的执行顺序是从上往下执行的); 阻止事件冒泡:   return false;  火狐/ie都支持 function(even){ var ev=even||window.even; if(ev&&ev.stopPropagation){ ev.stopPropagation(); }else{ window.event.cancelBubble=true; } } 这是H

看懂此文,不再困惑于javascript中的事件绑定、事件冒泡、事件捕获和事件执行顺序

最近一个项目基于3维skyline平台,进行javascript二次开发.对skyline事件的设计真是无语至极,不堪折磨啊!抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在html文档中绑定.在js代码中绑定.下面的方式1.方式2属于在html中绑定事件,方式3.方式4和方式5属于在js代码中绑定事件,其中方法5是最推荐的做法. 方式1: HTML的DOM元素

javascript事件之: 事件冒泡, 事件捕获 ,阻止默认事件

谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. 冒泡篇: 先来看一段实例: js: var $input = document.getElementsByTagName("input")[0]; var $div = document.getElementsByTagName("div")[0]; var $body = document.getElementsByTagName("

前端-【学习心得】-聊一聊事件冒泡和事件捕获

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" conte

事件流:事件冒泡和事件捕获

事件流:事件冒泡和事件捕获 1. 两者概念 事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件., element.addEventListener(event,function(),false); 事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获. element.addEventListener(event,function(),true); 从上面可知,第三个参数为true或者false; true,事件捕获: fals

聊聊事件冒泡与事件捕获

什么是事件? 事件是文档和浏览器窗口中发生的特定的交互瞬间. 什么是事件流: 事件流描述的是从页面中接受事件的顺序( 说白了就是解决页面中事件流发生顺序的问题.),但有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两个截然相反的事件流概念,IE的事件流是事件冒泡流(event bubbling),而Netscape的事件流是事件捕获流(event capturing). 让我们先聊聊DOM0级事件与DOM2级事件 DOM0 直接通过 onclick写在html里面的事件, 比

事件流 事件冒泡和事件捕获

事件冒泡和事件捕获 他们是描述事件触发时序问题的术语. DOM标准规定事件流包括三个阶段:事件捕获阶段.处于目标阶段和事件冒泡阶段.捕获型事件流:事件的传播是从最不特定的事件目标到最特定的事件目标.即从外部到内部. 冒泡型事件流:事件的传播是从最特定的事件目标到最不特定的事件目标.即从内部到外部 事件冒泡 <body> <div class="parent"> <div class="son"> <div class=&qu