社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Jquery

e.StopPropagation在jQuery中无法按预期工作

Bryan • 5 年前 • 331 次点击  

我有下表:

$("body").on('click', ".application-checkbox", function (e) {
      alert('checkbox');
      e.stopPropagation();
  });

  $('body').on('click', "tr", function (e) {
      alert('row');
  });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table> 
 <tr>
     <td>
         <div class="ckbox">
           <input type="checkbox" class="application-checkbox" id="checkbox">
           <label for="checkbox">label</label>
         </div>
      </td>
      <td></td>
    </tr>
</table>

当我单击复选框时,“row”和“checkbox”都会被打印出来。我做错什么了?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38232
 
331 次点击  
文章 [ 1 ]  |  最新文章 5 年前
t.niese
Reply   •   1 楼
t.niese    6 年前

两个事件处理程序都附加到 body 元素。和文档 event.stopPropagation() 说:

请注意,这不会阻止 相同的 元素。

从那时起 stopPropagation 不会阻止对同一元素执行处理程序,它会防止进一步传播到其他元素。

如果即使同一元素上的所有其他事件处理程序都不应再执行,则需要 event.stopImmediatePropagation() :

描述:保持其余处理程序不被执行,并防止事件在DOM树上冒泡。

$("body").on('click', ".application-checkbox", function(e) {
  alert('checkbox');
  e.stopImmediatePropagation();
});

$('body').on('click', "tr", function(e) {
  alert('row');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
  <tr>
    <td>
      <div class="ckbox">
        <input type="checkbox" class="application-checkbox" id="checkbox">
        <label for="checkbox">label</label>
      </div>
    </td>
    <td></td>
  </tr>
</table>

但该方法的问题在于,回调是按照附加顺序调用的,因此如果 tr .application-checkbox 它不起作用。

因此,您需要修复该问题,或者需要将事件侦听器附加到DOM的不同级别:

$("tbody").on('click', ".application-checkbox", function(e) {
  alert('checkbox');
  e.stopPropagation();
});

$('table').on('click', "tr", function(e) {
  alert('row');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>
        <div class="ckbox">
          <input type="checkbox" class="application-checkbox" id="checkbox">
          <label for="checkbox">label</label>
        </div>
      </td>
      <td></td>
    </tr>
  </tbody>
</table>