简体   繁体   English

使用.on()时,几次单击后,jQuery(2.2.0)Click侦听器停止工作,但.click()可以正常工作

[英]Jquery (2.2.0) click listener stops working after few clicks when using .on() but .click() works fine

I'm using bootstrap 3.3.6 with Jquery 2.2.0, and I'm trying to use .on() to set a click listener to my bootstrap dropdown menu items. 我正在将Bootstrap 3.3.6与Jquery 2.2.0一起使用,并且尝试使用.on()设置我的bootstrap下拉菜单项的单击侦听器。 The link clicks register a few clicks (2-3 usually), but then they stop working. 链接点击会记录几次点击(通常为2-3次),但随后它们将停止工作。 If I use .click() , then the clicking continues to work without issue. 如果我使用.click() ,则单击将继续工作而不会出现问题。

Exact steps taken: 采取的确切步骤:

  1. Use "My item 1" menu to "Move down"; 使用“我的项目1”菜单中的“向下移动”; this moves it beneath "My item 2" 这会将其移动到“我的项目2”下方
  2. Use "My item 2" menu to "Move down"; 使用“我的项目2”菜单“向下移动”; this moves it beneath "My item 1" 这会将其移动到“我的项目1”下方
  3. Use "My item 1" menu to "Move down"; 使用“我的项目1”菜单中的“向下移动”; this fails to move 这不能动

JS Fiddle demonstrating issue here: https://jsfiddle.net/e8qgqv9r/3/ JS Fiddle在这里演示问题: https//jsfiddle.net/e8qgqv9r/3/

<script>
$('#my-items').on('click', '.my-item-menu li a', function() {  // FAILS
//$(document).on('click', '.my-item-menu li a', function() {  // FAILS
//$('.my-item-menu li a').click(function() {  // WORKS
  var link = $(this);
  var item = link.parent().parent().parent().parent().parent().parent();

  if(link.hasClass('move_up')) {
    if(item.index() > 0) {
      item.parent().children().eq(item.index() - 1).insertAfter(item);
    }
  }
  else if(link.hasClass('move_down')) {
    if(item.index() < item.parent().children().length - 1) {
      item.parent().children().eq(item.index() + 1).insertBefore(item);
    }
  }
  else if(link.hasClass('tlog_remove')) {
    item.remove();
  }
  link.closest('.my-item-menu').dropdown('toggle');
  return false;
});
</script>
<div id="my-items">
  <div class="well well-sm">
    <div class="row">
      <div class="col-md-8 col-sm-8 col-xs-8">
        <h4>My item 1</h4>
      </div>
      <div class="col-md-4 col-sm-4 col-xs-4">
        <div class="dropdown pull-right">
          <button id="menu-opt-btn-1" type="button" class="btn btn-default btn-sm" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            options
            <span class="caret"></span>
          </button>
          <ul class="my-item-menu dropdown-menu" aria-labelledby="menu-opt-btn-1">
            <li><a href="" class="move_up">Move up</a></li>
            <li><a href="" class="move_down">Move down</a></li>
            <li><a href="" class="remove_item">Remove item</a></li>
          </ul>
        </div>
      </div>
    </div>
  </div>

  <div class="well well-sm">
    <div class="row">
      <div class="col-md-8 col-sm-8 col-xs-8">
        <h4>My item 2</h4>
      </div>
      <div class="col-md-4 col-sm-4 col-xs-4">
        <div class="dropdown pull-right">
          <button id="menu-opt-btn-2" type="button" class="btn btn-default btn-sm" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            options
            <span class="caret"></span>
          </button>
          <ul class="my-item-menu dropdown-menu" aria-labelledby="menu-opt-btn-2">
            <li><a href="" class="move_up">Move up</a></li>
            <li><a href="" class="move_down">Move down</a></li>
            <li><a href="" class="remove_item">Remove item</a></li>
          </ul>
        </div>
      </div>
    </div>
  </div>
</div>

Am I using .on() incorrectly, or is this a potential bug with jquery/bootstrap? .on()错误地使用了.on() ,或者这是jquery / bootstrap的潜在错误? (or my browser -- currently running Chrome 48.0.2564.103 (64-bit) on OS X?) (或我的浏览器-当前在OS X上运行Chrome 48.0.2564.103(64位)吗?)

Not sure why, might have to do on how bootstraps dropdown plugin works, but you seem to be calling dropdown('toggle') on the wrong element. 不知道为什么,可能必须与bootstraps dropdown插件的工作方式有关,但是您似乎在错误的元素上调用dropdown('toggle') So it might be that doing a toggle on an element that isn't setup for dropdowns (eg isn't the data-toggle element) ends up having the bubbling of their events canceled in effect making it never reach your #my-items or document elements. 因此,可能是在未设置下拉菜单的元素上进行toggle (例如,不是data-toggle元素)最终导致事件冒泡被取消,从而使其永远无法到达您的#my-itemsdocument元素。 But this is just a guess you would have to dive into their code to see for sure. 但这只是猜测,您必须深入研究他们的代码才能确定。

Switch 开关

link.closest('.my-item-menu').dropdown('toggle');

to something like

link.closest('.dropdown').find("button").dropdown('toggle');

and it now works as expected 现在可以正常使用了

Demo 演示

 $('#my-items').on('click', '.my-item-menu li a', function() { //$(document).on('click', '.my-item-menu li a', function() { //$('.my-item-menu li a').click(function() { var link = $(this); var item = link.parent().parent().parent().parent().parent().parent(); if(link.hasClass('move_up')) { if(item.index() > 0) { item.parent().children().eq(item.index() - 1).insertAfter(item); } } else if(link.hasClass('move_down')) { if(item.index() < item.parent().children().length - 1) { item.parent().children().eq(item.index() + 1).insertBefore(item); } } else if(link.hasClass('tlog_remove')) { item.remove(); } link.closest('.dropdown').find("button").dropdown('toggle'); return false; }); 
 <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script> <div id="my-items"> <div class="well well-sm"> <div class="row"> <div class="col-md-8 col-sm-8 col-xs-8"> <h4>My item 1</h4> </div> <div class="col-md-4 col-sm-4 col-xs-4"> <div class="dropdown pull-right"> <button id="menu-opt-btn-1" type="button" class="btn btn-default btn-sm" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> options <span class="caret"></span> </button> <ul class="my-item-menu dropdown-menu" aria-labelledby="menu-opt-btn-1"> <li><a href="" class="move_up">Move up</a></li> <li><a href="" class="move_down">Move down</a></li> <li><a href="" class="remove_item">Remove item</a></li> </ul> </div> </div> </div> </div> <div class="well well-sm"> <div class="row"> <div class="col-md-8 col-sm-8 col-xs-8"> <h4>My item 2</h4> </div> <div class="col-md-4 col-sm-4 col-xs-4"> <div class="dropdown pull-right"> <button id="menu-opt-btn-2" type="button" class="btn btn-default btn-sm" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> options <span class="caret"></span> </button> <ul class="my-item-menu dropdown-menu" aria-labelledby="menu-opt-btn-2"> <li><a href="" class="move_up">Move up</a></li> <li><a href="" class="move_down">Move down</a></li> <li><a href="" class="remove_item">Remove item</a></li> </ul> </div> </div> </div> </div> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM