js阻止冒泡问题?

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="outDiv" style="width: 100px; height: 200px; background-color: bisque;" contenteditable="true">
    外
    <div id="innerDiv" style="width: 50px; height: 100px; background-color: aquamarine;" contenteditable="true" oninput="handler2(event)">内</div>
  </div>
</body>
<script>
  function handler1(e) {
    console.log('外', e.target)
  }
  function handler2(e) {
    console.log('内', e.target)
    e.stopPropagation()
  }
  // document.getElementById('outDiv').addEventListener('input', handler1)
  // document.getElementById('innerDiv').addEventListener('input', handler2)
</script>
</html>

在以上代码中,当我在innerDiv中输入时,handler2无法触发,handler1总是触发

尝试过在handler2中阻止了事件冒泡,但是似乎因为handler2触发都没触发,所以e.stopPropagation()也无效,我想得到的结果是,在innerDiv中输入时,只触发handler2,在outDiv中输入时,只触发handler1,应该如何优化?

阅读 376
3 个回答

问题出在你使用的是input事件并且用在了contenteditable元素上:
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/inpu...
1737447859630.jpg
也就是说你这两个事件的target都是outDiv,自然就会触发handler1了
不信的话你换成onclick事件就会发现正常了
建议你就使用普通的input来搭配oninput

新手上路,请多包涵

你要不尝试打开获取元素的方法?

并且将'input' 换成 'click' ?

image.png

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>阻止事件冒泡示例</title>
</head>
<body>
    <div id="outerDiv" style="padding: 20px; background-color: lightblue;">
        Outer Div
        <div id="innerDiv" style="padding: 20px; background-color: lightcoral;">
            Inner Div
        </div>
    </div>

    <script>
        document.getElementById('outerDiv').addEventListener('click', function() {
            alert('Outer Div Clicked');
        });

        document.getElementById('innerDiv').addEventListener('click', function(event) {
            alert('Inner Div Clicked');
            event.stopPropagation(); // 阻止事件冒泡
        });
    </script>
</body>
</html>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏