重叠onClick()事件表中的元素

时间:2019-05-14 19:51:14

标签: jquery

我在HTML表格的$top_message = nl2br(trim($top_message)); 标签内创建一个按钮。

我添加了一个侦听器,以在点击事件触发警报。

HTML表的<td>标记同样适用于事件侦听器,并通过单击按钮上的不同文本触发警报。

下面的代码段说明了上述情况。

<td>
$("#mytable").on("click", "td", function() {
    alert('this is td');
});  
   
$("#mybutton").on("click", function() {
    alert('this is button');
});
       

如何有效地执行按钮上的click事件而不触发包含按钮的<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script> <table id="mytable"> <tr> <td style="border: 1px solid black; width: 500px; height: 20px"> <span>table</span> <button style="margin: 5px; padding:5px; border: 1px solid black; float: right" id="mybutton"> display</button> </td> </tr> </table>标签的click事件?

2 个答案:

答案 0 :(得分:1)

在单击按钮消耗掉click事件之后,必须停止传播click事件。这是通过在事件上调用 stopPropagation()函数来完成的。否则-根据您的经验-事件将传播到下一个元素。

这是一个例子:

 $("#mytable").on("click", "td", function() {
     alert('this is td');
   });
   
   
 $("#mybutton").on("click", function(event) {
   event.stopPropagation();
     alert('this is button');
   });
   
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<table id="mytable">
<tr>
  <td style="border: 1px solid black; width: 500px; height: 20px">test
  <button style="margin: 5px; padding:5px; border: 1px solid black; float: right" id="mybutton"> display</button>
  </td>
</tr>
</table>

答案 1 :(得分:-1)

出于记录目的,我更喜欢默默无闻的方法,如果可能的话 。但是,这将防止发生由点击触发的 all 进一步事件。如果点击涉及多个事件,而您只想定位要忽略的特定事件,则可能需要类似以下内容的方案...

(function($){
    // creating variables for the event handlers, for cleaner code below
    let tdEvtHandler = function() {
     alert('this is td');
   };

   let bindTd= function() {
     $("#mytable").on("click", "td", tdEvtHandler);
   };

   let btnEvtHandler = function() {
     // The button's evt handler will take precedence when
     // the button is clicked, so you can disable just the
     // td's evt handler at this point, do your work, then
     // re-enable the td's evt handler.  Re-binding needs to
     // be done with a timeout to allow the current event
     // chain to complete before (re)binding takes place.

     $("#mytable").off("click", "td", tdEvtHandler);
     alert('this is button');
     setTimeout(bindTd);
   };

   bindTd();
   $("#mybutton").on("click", btnEvtHandler);
})(jQuery);