最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript的事件代理和委托实例分析_javascript技巧

来源:动视网 责编:小采 时间:2020-11-27 21:36:11
文档

JavaScript的事件代理和委托实例分析_javascript技巧

JavaScript的事件代理和委托实例分析_javascript技巧:在JavaScript中,经常会碰到要监听列表中多项li的情形,假设我们有一个列表如下: 代码如下: item1 item2 item3 item4 如果我们要实现以下功能:当鼠标点击某一li时,alert输出该li的内容,我们通常的写法是这样的: 当列表项比较少时,直接给每个li添
推荐度:
导读JavaScript的事件代理和委托实例分析_javascript技巧:在JavaScript中,经常会碰到要监听列表中多项li的情形,假设我们有一个列表如下: 代码如下: item1 item2 item3 item4 如果我们要实现以下功能:当鼠标点击某一li时,alert输出该li的内容,我们通常的写法是这样的: 当列表项比较少时,直接给每个li添
 在JavaScript中,经常会碰到要监听列表中多项li的情形,假设我们有一个列表如下:

代码如下:

  • item1

  • item2

  • item3

  • item4


  • 如果我们要实现以下功能:当鼠标点击某一li时,alert输出该li的内容,我们通常的写法是这样的:

    当列表项比较少时,直接给每个li添加onclick事件
    列表项比较多时,在onload时就给每个列表项调用监听
    第一种方法比较简单直接,但是没有顾及到html与JavaScript的分离,不建议使用,第二种方法的代码如下:

    代码如下:
    window.onload=function(){
    var ulNode=document.getElementById("list");
    var liNodes=ulNode.childNodes||ulNode.children;
    for(var i=0;i liNodes[i].addEventListener('click',function(e){
    alert(e.target.innerHTML);
    },false);
    }
    }

    由上可以看出来,假如不停的删除或添加li,则function()也要不停的更改操作,易出错,因此推荐使用事件代理,在使用事件代理之前,我们先来了解一下事件阶段(event phase):

    事件阶段:

    当一个DOM事件被触发的时候,他并不是只在它的起源对象上触发一次,而是会经历三个不同的阶段。简而言之:事件一开始从文档的根节点流向目标对象(捕获阶段),然后在目标对向上被触发(目标阶段),之后再回溯到文档的根节点(冒泡阶段)如图所示(图片来自W3C):

    事件捕获阶段(Capture Phase)

    事件的第一个阶段是捕获阶段。事件从文档的根节点出发,随着DOM树的结构向事件的目标节点流去。途中经过各个层次的DOM节点,并在各节点上触发捕获事件,直到到达时间的目标节点。捕获阶段的主要任务是简历传播路径,在冒泡阶段,时间会通过这个路径回溯到文档根节点。

    代码如下:
    element.removeEventListener(<event-name>, , );

    我们通过上面的这个函数来给节点设置监听,可以通过将;设置成true来为事件的捕获阶段添加监听回调函数。在实际应用中,我们并没有太多使用捕获阶段监听的用例,但是通过在捕获阶段对事件的处理,我们可以阻止类似click事件在某个特定元素上被触发。

    代码如下:
    var form=document.querySeletor('form');
    form.addEventListener('click',function(e){
    e.stopPropagation();
    },true);

    如果你对这种用法不是很了解的话,最好还是将设置为false或者undefined,从而在冒泡阶段对事件进行监听。

    目标阶段(Target Phase)

    当事件到达目标节点时,事件就进入了目标阶段。事件在目标节点上被触发,然后逆向回流,知道传播到最外层的文档节点。

    对于多层嵌套的节点,鼠标和指针事件经常会被定位到最里层的元素上。假设,你在一个div元素上设置了click的监听函数,而用户点击在了这个div元素内部的p元素上,那么p元素就是这个时间的目标元素。事件冒泡让我们可以在这个div或者更上层的元素上监听click事件,并且时间传播过程中触发回调函数。

    冒泡阶段(Bubble Phase)

    事件在目标事件上触发后,并不在这个元素上终止。它会随着DOM树一层层向上冒泡,直到到达最外层的根节点。也就是说,同一事件会一次在目标节点的父节点,父节点的父节点...直到最外层的节点上触发。

    绝大多数事件是会冒泡的,但并非所有的。具体可见:规范说明

    由上我们可以想到,可以使用事件代理来实现对每一个li的监听。代码如下:

    代码如下:
    window.onload=function(){
    var ulNode=document.getElementById("list");
    ulNode.addEventListener('click',function(e){
    if(e.target&&e.target.nodeName.toUpperCase()=="LI"){/*判断目标事件是否为li*/
    alert(e.target.innerHTML);
    }
    },false);
    };

    以上所述就是本文的全部内容了,希望能够对大家熟悉javascript事件的委托和代理能够有所帮助。

    请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

    文档

    JavaScript的事件代理和委托实例分析_javascript技巧

    JavaScript的事件代理和委托实例分析_javascript技巧:在JavaScript中,经常会碰到要监听列表中多项li的情形,假设我们有一个列表如下: 代码如下: item1 item2 item3 item4 如果我们要实现以下功能:当鼠标点击某一li时,alert输出该li的内容,我们通常的写法是这样的: 当列表项比较少时,直接给每个li添
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top