event.stopPropagation() 不起作用 - 捕获仍然传递函数

2024-03-07

首先 - 我是一个菜鸟。抱歉,如果这个问题足够基本。 其次 - 我尝试搜索,正如我所看到的,我按照其他帖子中的说明应用了解决方案。

话虽这么说... 我有三组 DIV。每组由 2 个 Div 组成(一个在另一个里面)。在 OUTER div 上有一个函数,表示如果单击它则创建边框。

要查看错误:

  1. 单击“外部”一词。
  2. 单击“内部”一词。

该代码应该仅在外部创建边框。

HTML

<html>
    <head>
        <title>Event Propagation</title>
        <meta charset="UTF-8" />

    </head>
    <body onload="onLoad()">

        <!--Squares 1-->
        <div style="display:inline-block">
            <div class="outer" style="height: 100px; width: 100px;">
                Outer
                <div class="inner" style="height: 50px; width: 50px;margin:20px"> 
                    Inner
                </div>
            </div>
        </div>
 <!--Squares 2-->
        <div style="display:inline-block">
            <div class="outer" style="height: 100px; width: 100px;">
                Outer
                <div class="inner" style="height: 50px; width: 50px;margin:20px"> 
                    Inner
                </div>
            </div>
        </div>

         <!--Squares 3-->
         <div style="display:inline-block">
            <div class="outer" style="height: 100px; width: 100px;">
                Outer
                <div class="inner" style="height: 50px; width: 50px;margin:20px"> 
                    Inner
                </div>
            </div>
        </div>


    </body>
</html>

The JS

    <script>
        function onLoad(){
            
            const elOuter = document.querySelectorAll(".outer")

            elOuter.forEach(element=>{
                element.addEventListener('click', fnChangeColor,false)
            })
        }

        function fnChangeColor(e){

            e.target.style.border="1px solid black"

            if (e.stopPropagation) {
  
                e.stopPropagation()
            } else {
  
                e.cancelBubble = true
            }
        }

    </script>

仅供参考 - 我解决了为孩子们创建事件并将 e.stopPropagation 归因于他们的问题。那行得通。但我知道这不是最好的方法。如果我有一个 div 里面有 100 个 div,那将是人间地狱。


这是因为当您单击“内部”时,e.target 元素是“内部”,而不是“外部”。

在我看来,你所做的似乎是试图理解事件委托, 这样做:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>xxx</title>
  <style>
    body > div { display:inline-block; }
    .outer     { height: 100px; width: 100px; background: lightgrey; }    
    .inner     { height: 50px; width: 50px;margin:20px; background: lightblue; }
    .bordering { border: 1px solid black; }
  </style>
</head>
<body>
   <div> <div class="outer">  Outer <div class="inner">  Inner </div> </div> </div>
   <div> <div class="outer">  Outer <div class="inner">  Inner </div> </div> </div>
   <div> <div class="outer">  Outer <div class="inner">  Inner </div> </div> </div>
<script>
document.body.onclick= e => {
  if (!e.target.matches('.outer')) return // ignore other click events
  e.target.classList.toggle('bordering') 
  }
</script>
</body>
</html>

或者这样

document.querySelectorAll('.outer').forEach(el=>{
  el.onclick=e=>{

    // console.log(e.target.className)
    if (!e.target.matches('.outer')) return // ignore other click events
    e.target.classList.toggle('bordering') 
  }
})

在您的代码中,仅使用了一个事件,并且无法进行任何传播。

当用户单击.inner该事件附加在.inner元素一个从不.outer.
就像泡沫一样,是自下而上的,而不是相反。 当气泡找到目标代码(出现侦听器)时,不再有传播并且气泡破裂。

如果你想看到事件传播,你必须设置2 个事件监听器(这意味着 2 个气泡)。

您可以通过添加 console.log(e.target.className) 来看到这一点,如下所示:

document.querySelectorAll(".outer, .inner") // => 6 event listeners
  .forEach(el=>{ el.addEventListener('click', getClick , false) })
 
var counter = 0

function getClick(e)
  {
  console.log( `${++counter} - event listener is on : ${e.currentTarget.className}
      clicked element is : ${e.target.className} `)
  }
  
cClear.onclick=_=>{ counter = 0; console.clear() }
body > div { display:inline-block; }
.outer     { height: 100px; width: 100px; background: lightgrey; }    
.inner     { height: 50px; width: 50px;margin:20px; background: lightblue; }
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<div> <div class="outer"> Outer <div class="inner"> Inner </div> </div> </div>
<button id="cClear">clear console</button>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

event.stopPropagation() 不起作用 - 捕获仍然传递函数 的相关文章

随机推荐

  • Typescript 中 `typeof x` 的类型是什么?

    在打字稿中 您可以像这样定义一个类 class Sup static member any static log console log sup 如果您执行以下操作 let x Sup 为什么 x 的类型等于typeof Sup 当我在 v
  • 以管理员身份运行与管理员组运行

    我有一个 C 应用程序 需要允许用户更改计算机名称 这是一项相当特权的操作 仅当用户以管理员身份运行应用程序 Windows 7 右键单击可执行文件 以管理员身份运行 时 我才能使其正常工作 很好 但是用户是管理员 那么为什么他们需要运行A
  • NSAttributedString initWithHTML 字符编码不正确?

    NSMutableAttributedString initWithHTML documentAttributes 似乎破坏了特殊字符 NSString html Hello World notice the smart quotes NS
  • C 三元表达式语句不起作用[重复]

    这个问题在这里已经有答案了 include
  • C# 中的 Xml 比较

    我正在尝试使用 C 代码比较两个 Xml 文件 我想忽略 Xml 语法差异 即前缀名称 为此我正在使用微软的C API 它适用于某些 Xml 但我找不到将其配置为与以下两个 Xml 一起使用的方法 XML A
  • 如何打开一个文件以进行读和写?

    有没有办法打开一个文件进行读取和写入 作为解决方法 我打开文件进行写入 关闭它 然后再次打开它进行读取 但是有没有办法打开文件both读写 以下是如何读取文件 然后写入文件 覆盖任何现有数据 而无需关闭并重新打开 with open fil
  • jQuery的toggleClass回调如何进行?

    我有这个简单的 jQuery 事件toggleClass this on click function this toggleClass fa stop circle 我想调用一些方法 如果fa stop circle被添加 我如何监控此事
  • Docker:从另一台服务器的私有注册表中提取问题

    我刚刚开始学习docker 我有一个在一台服务器 server1 上运行的私有注册表 并且可以通过键入以下内容从 server1 上提取测试映像 docker pull 127 0 0 1 5000 test 但是 当我从另一台服务器键入上
  • libgdx Shaperenderer line ..如何绘制特定宽度的线

    我正在尝试使用 libgdx 形状渲染器绘制一条特定宽度的线 我跟着这个link https stackoverflow com questions 18650619 increasing the width of line drawn u
  • R - 图中线交点的坐标

    的结构data是以下 df1 lt structure list V2 1 10 V1 c 1 4 1 5 1 9 4 5 6 7 7 8 8 1 8 2 8 3 8 9 class data frame row names c NA 10
  • 计算位数 - 哪种方法最有效?

    查找给定数字中的位数有不止一种解决方案 例如 方法一 int findn int num char snum 100 sprintf snum d num return strlen snum 方法2 int findn int num i
  • MIPS 寄存器 $0 可以用来存储和检索值吗?

    当我了解 MIPS 处理器时 我的脑海中牢记着读取 0 寄存器总是返回 0 而写入 0 总是被丢弃 来自 MIPS 程序员手册 2 13 4 1 CPU 通用寄存器 r0 被硬连线到一个值 零 并且可以用作任何指令的目标寄存器 结果是被丢弃
  • Windows 服务中 RuntimeHelpers.PrepareMethod 的缺点[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在调查服务器 具有多个服务 启动后不久发生的延迟问题 我添加了一个简单的方法来加载引用的 DLL 并执行RuntimeHelpers Pre
  • 如何通过SW在AMP页面中包含自定义JS?

    我们已经浏览了所有可能的 AMP 博客 但找不到任何在 AMP 中包含自定义 JS 的方法 这个博客 https www ampproject org docs guides pwa amp amp as pwa extend your a
  • 类似 Chrome 的菜单显示

    我正在尝试查找一些有关如何创建看起来像 Android chrome 菜单顶部的菜单的信息 我尝试过为 Android 4 0 实现图标 但没有成功 尝试过谷歌搜索 但我发现的唯一答案是当 API gt 11 时无法实现图标 那么 Chro
  • JavaScript 中相当于 PHP 中的 var_dump 或 print_r 的是什么? [复制]

    这个问题在这里已经有答案了 我想查看 JavaScript 中对象的结构 用于调试 PHP中有类似var dump的东西吗 大多数现代浏览器的开发工具中都有一个控制台 对于此类调试很有用 console log myvar 然后 您将在控制
  • Python BaseHTTPServer.HTTPServer - 启动和停止事件的回调

    参考 http docs python org 2 library basehttpserver html http docs python org 2 library basehttpserver html 我有以下使用的代码片段Pyth
  • JPA GenerationType.AUTO 不考虑具有自动增量的列

    我有一个表 其中有一个简单的 int id 列 在 SQL Server 中具有身份自动增量 实体的 Id 注释为 Id and GeneratedValue Id GeneratedValue strategy GenerationTyp
  • 如何在 django 中安全地存储第三方服务的密码?

    我正在 Django 上运行 Web 服务 用户注册到我的系统并向我提供第三方网络服务的登录详细信息 用户名和密码 我的目的是以最好 最安全的方式存储这些详细信息 不幸的是 我的服务需要这些数据来用于查询第 3 方服务的某些离线脚本 因此我
  • event.stopPropagation() 不起作用 - 捕获仍然传递函数

    首先 我是一个菜鸟 抱歉 如果这个问题足够基本 其次 我尝试搜索 正如我所看到的 我按照其他帖子中的说明应用了解决方案 话虽这么说 我有三组 DIV 每组由 2 个 Div 组成 一个在另一个里面 在 OUTER div 上有一个函数 表示