博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS stopPropagation()
阅读量:4132 次
发布时间:2019-05-25

本文共 2818 字,大约阅读时间需要 9 分钟。

本文转自:和慕课网

jQuery Event.stopPropagation() 函数详解

1,概念先知

  (一)事件流概念:

     事件流描述的是从页面中接受事件的顺序。

      1、事件冒泡

            事件冒泡,即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上转播至最不具体的节点(文档)。
       2、事件捕获
            事件捕获的思想是不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件。

  (二)事件处理程序

      1、HTML事件处理程序

       2、DOM0级事件处理程序
       3、DOM2级事件处理程序
            DOM2级事件定义了两个方法:用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener()。它们都接收三个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。
       4、IE事件处理程序
            (1) attachEvent()添加事件
            (2) detachEvent()删除事件
            这两个方法接收相同的两个参数:事件处理程序名称与事件处理函数。
       5、跨浏览器的事件处理程序

  (三)事件对象

       1、DOM中的事件对象
            (1) type:获取事件类型
            (2) target:事件目标
            (3) stopPropagation() 阻止事件冒泡
            (4) preventDefault() 阻止事件的默认行为
       2、IE中的事件对象
            (1) type:获取事件类型
            (2) srcElement:事件目标
            (3) cancelBubble=true阻止事件冒泡
            (4) returnValue=false阻止事件的默认行为

2,stopPropagation()

stopPropagation()函数用于阻止当前事件在DOM树上冒泡

根据DOM事件流机制,在元素上触发的大多数事件都会冒泡传递到该元素的所有祖辈元素上,如果这些祖辈元素上也绑定了相应的事件处理函数,就会触发执行这些函数。

使用stopPropagation()函数可以阻止当前事件向祖辈元素的冒泡传递,也就是说该事件不会触发执行当前元素的任何祖辈元素的任何事件处理函数。

该函数只阻止事件向祖辈元素的传播,不会阻止该元素自身绑定的其他事件处理函数的函数。不仅会阻止事件向祖辈元素的传播,还会阻止该元素绑定的其他(尚未执行的)事件处理函数的执行。

此外,由于live()函数并不是将事件处理函数直接绑定到自己身上,而是"委托"绑定到祖辈元素上,由祖辈元素来触发执行。live()函数会先一次性冒泡到文档的顶部,然后为符合条件的元素触发事件。因此,stopPropagation()函数无法阻止live事件的冒泡。

同样地,delegate()函数也是"委托事件函数",只有事件冒泡传递到"受委托"的祖辈元素才会被触发执行。因此,stopPropagation()函数无法阻止该元素到"受委托"的祖辈元素之间的事件冒泡。

该函数属于jQuery的。

语法

eventObject.stopPropagation( )

返回值

stopPropagation()函数没有返回值,也可以说返回值为undefined

示例&说明

请参考下面这段HTML代码:

   

段落文本内容           

event.stopPropagation()函数相关的jQuery示例代码如下:

// 为所有div元素绑定click事件$("div").click( function(event){
    alert("div-click");} );//为所有p元素绑定click事件$("p").click( function(event){
    alert("p-click");} );//为所有button元素绑定click事件$(":button").click( function(event){
    alert("button-click");    // 阻止事件冒泡到DOM树上    event.stopPropagation(); // 只执行button的click,如果注释掉该行,将执行button、p和div的click   } );

注意,live()函数无法阻止事件的冒泡传递,相应的jQuery示例代码如下(仍参照上面的HTML代码)。点击按钮,p-click、div-click、button-click都会执行:

// 为所有div元素的click事件绑定处理函数$("div").click( function(event){
    alert("div-click");} );// 为所有p元素的click事件绑定处理函数$("p").click( function(event){
    alert("p-click");} );// 为div元素内的所有button元素的click事件绑定处理函数$("div").live("click", ":button", function(event){
    alert("button-click");    event.stopPropagation();} );// 点击按钮,所有事件处理函数都会执行// 因为live()函数先直接冒泡到document,然后再来触发事件,因此它无法阻止事件冒泡(执行函数时都已经冒泡完毕,当然无法阻止)

delegate()函数无法阻止该元素和"受委托"元素之间的事件冒泡,相应的jQuery示例代码如下(仍参照上面的HTML代码)。点击按钮,会执行p-click、button-click:

// 为所有div元素的click事件绑定处理函数$("div").click( function(event){
    alert("div-click");} );// 为所有p元素的click事件绑定处理函数$("p").click( function(event){
    alert("p-click");} );// 为div元素内的所有button元素的click事件绑定处理函数$("div").delegate(":button", "click", function(event){
    alert("button-click");    event.stopPropagation();} );// 点击按钮,会执行p-click和button-click// 因为delegate()函数会把button元素的点击事件委托给div元素来触发,所以事件必须冒泡到div元素才能触发,它无法阻止button到div之间的事件冒泡,所以会执行p-click。

转载地址:http://dyjvi.baihongyu.com/

你可能感兴趣的文章
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
关于无线PCB中 中50欧姆的特性阻抗的注意事项
查看>>
Spring的单例模式源码小窥
查看>>
后台服务的变慢排查思路(轻量级应用服务器中测试)
查看>>
MySQL中InnoDB事务的默认隔离级别测试
查看>>
微服务的注册与发现
查看>>
bash: service: command not found
查看>>
linux Crontab 使用 --定时任务
查看>>
shell编程----目录操作(文件夹)
查看>>
机器学习-----K近邻算法
查看>>
HBASE安装和简单测试
查看>>
关于程序员的59条搞笑但却真实无比的编程语录
查看>>
搞笑--一篇有趣的文章编译自一篇西班牙博客。有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
查看>>
非常不错 Hadoop 的HDFS (Hadoop集群(第8期)_HDFS初探之旅)
查看>>