未选中复选框或脚本停止继续

Either checkbox isn't checked OR script stops from continuing

  1. 我希望用户只需单击该行,然后选中或取消选中该复选框。
  2. 我希望该行具有动画效果并向上或向下移动,以便选中的项目显示在列表底部。

一切正常! :-)

但是当我点击实际的复选框时,它并没有被选中。 我试过使用 stopPropagation,但它只是停止了动画。

我已经尝试了很多东西,但 none 都有效。 :-(

怎么办?? :/

您可以在此处查看演示:

$(document).ready(function () {
 $('.row').click(function (){
  var checkbox = $(this).find('input[type=checkbox]');
  checkbox.prop("checked", !checkbox.prop("checked"));
  
  var upordown = checkbox.prop("checked");
  if(upordown){
   $( this ).slideUp(function() {$( this ).insertAfter( "#foo" );
      $( this ).slideDown();
       });
   }
  else{
   
   $( this ).slideUp(function() {$( this ).insertBefore( "#foo" );
      $( this ).slideDown();
    });
   }
 });
 
// $('input[type=checkbox]').click(function (e)
// {
//  e.stopPropagation();
//  return true;
// });
 
});
.row {
 width: 300px;
 padding: 4px;
 margin: 2px;
  border:1px solid #666;
}
.left {
 float: left;
 width: 25px;
}
.clear {
 clear: both;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="row">Todo</div>
<div class="row">
  <div class="left">
    <input type="checkbox" value="1"/>
  </div>
  <div class="center">Item1</div>
  <div class="clear"></div>
</div>
<div class="row">
  <div class="left">
    <input type="checkbox" value="2"/>
  </div>
  <div class="center">Item2</div>
  <div class="clear"></div>
</div>
<div class="row">
  <div class="left">
    <input type="checkbox" value="4"/>
  </div>
  <div class="center">Item3</div>
  <div class="clear"></div>
</div>
<div class="row">
  <div class="left">
    <input type="checkbox" value="6"/>
  </div>
  <div class="center">Item4</div>
  <div class="clear"></div>
</div>
<div class="row">
  <div class="left">
    <input type="checkbox" value="11"/>
  </div>
  <div class="center">Item5</div>
  <div class="clear"></div>
</div>
<div class="row" id="foo" style="Display: none;"></div>

我怀疑是冒泡事件的问题。考虑以下代码。

$(function() {
  $(".row, input[type='checkbox']").click(function(e) {
    var row;
    if ($(e.target).is(".row")) {
      row = $(e.target);
    } else {
      row = $(e.target).closest(".row");
    }
    var checkbox = $('input[type=checkbox]', row);
    checkbox.prop("checked", !checkbox.prop("checked"));

    var up = checkbox.prop("checked");
    if (up) {
      row.slideUp(function() {
        row.insertAfter("#foo").slideDown();
      });
    } else {
      row.slideUp(function() {
        row.insertBefore("#foo").slideDown();
      });
    }
  });
});
.row {
  width: 300px;
  padding: 4px;
  margin: 2px;
  border: 1px solid #666;
}

.left {
  float: left;
  width: 25px;
}

.clear {
  clear: both;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="list-wrapper">
  <div class="row">Todo</div>
  <div class="row">
    <div class="left">
      <input type="checkbox" value="1" />
    </div>
    <div class="center">Item1</div>
    <div class="clear"></div>
  </div>
  <div class="row">
    <div class="left">
      <input type="checkbox" value="2" />
    </div>
    <div class="center">Item2</div>
    <div class="clear"></div>
  </div>
  <div class="row">
    <div class="left">
      <input type="checkbox" value="4" />
    </div>
    <div class="center">Item3</div>
    <div class="clear"></div>
  </div>
  <div class="row">
    <div class="left">
      <input type="checkbox" value="6" />
    </div>
    <div class="center">Item4</div>
    <div class="clear"></div>
  </div>
  <div class="row">
    <div class="left">
      <input type="checkbox" value="11" />
    </div>
    <div class="center">Item5</div>
    <div class="clear"></div>
  </div>
  <div class="row" id="foo" style="Display: none;"></div>
</div>

这按预期工作。由于 row 元素可能不是点击目标,我们可能需要解决这个问题以确保我们选择了正确的元素。