javascript复选框功能只工作一次

时间:2016-12-15 19:34:02

标签: javascript jquery checkbox

使用Bootstrap 3.3.6,JQuery 1.11.3

我遇到一个小部分问题,特别是在用户点击该行时选择和取消选中复选框。

jsfiddle here:http://jsfiddle.net/0ogdt9s7/1/

HTML

<div id="not-working">
  <h3>
  Click the text, then click the box
  </h3>
  <div class="selection-row" data-id="20">
    <div class="col-md-5">Data 20</div>
    <div class="col-md-2">
      <input type="checkbox" name="selectedDudes[]" value="20" id="checkbox-20">
    </div>
  </div>
  <div class="selection-row" data-id="22">
    <div class="col-md-5">Data 22</div>
    <div class="col-md-2">
      <input type="checkbox" name="selectedDudes[]" value="22" id="checkbox-22">
    </div>
  </div>
</div>

JS

$(document).ready(function() {

  $(document).on("click", "div.selection-row", function() {
    var $cb = $('input[type="checkbox"]', $(this)), is_on = $cb.prop('checked');
    if (is_on) {
      //if its already checked, uncheck it
      $cb.prop('checked', false);
    } else {
      //if its not checked, check it
      $cb.prop('checked', true);
    }
  });
});

行选择效果很好,但如果单击行内的复选框,则复选框不会更改。单击“数据”将正确更改它,但复选框无效。

需要注意的重要事项:

它必须位于$(document).on()内,因为它位于通过AJAX显示的弹出窗口内。

我认为这是超级简单的东西,但我找不到它。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:2)

由于Bubbling phase,您收到了意外的结果。

事件的冒泡阶段会触发从下到上收听事件的所有元素的父母:

enter image description here

在您的情况下,当用户第一次单击该复选框时,它会被选中。然后Blubbling阶段发生并开始搜索正在侦听事件的最近父节点,如果存在,则其处理程序(函数)被执行。你有一个:selection-row

.selection-row元素的处理程序会恢复复选框的默认行为,因此就像用户没有做任何事情一样。

如果你想要的是当用户点击Data 20Data 22并且相应的复选框被选中时,你不需要使用javascript。 label元素应该解决:

  <div class="selection-row" data-id="20">
  <div class="col-md-5"><label for="checkbox-20" >Data 20</label></div>
    <div class="col-md-2">
      <input type="checkbox" name="selectedDudes[]" value="20" id="checkbox-20">
    </div>
  </div>
  <div class="selection-row" data-id="22">
  <div class="col-md-5"><label for="checkbox-22">Data 22</label></div>
    <div class="col-md-2">
      <input type="checkbox" name="selectedDudes[]" value="22" id="checkbox-22">
    </div>
  </div>

检查出来:http://jsfiddle.net/0ogdt9s7/2/

正如你所说,你需要整个行是可点击的,你可以检查事件的原始目标(最里面的元素)是否是input并让默认行为通过中断处理程序来完成它的工作return;

$(document).on("click", "div.selection-row", function(e) {
    if ($(e.target).is('input')) return;

    var $cb = $('input[type="checkbox"]', $(this)), is_on = $cb.prop('checked');
    if (is_on) {
      //if its already checked, uncheck it
      $cb.prop('checked', false);
    } else {
      //if its not checked, check it
      $cb.prop('checked', true);
    }
  });

检查此解决方案:http://jsfiddle.net/0ogdt9s7/6/

答案 1 :(得分:0)

Coworker刚刚通过目标检查解决了这个问题:

http://jsfiddle.net/0ogdt9s7/4/

$(document).ready(function() {
  $(document).on("click", ".selection-row", function(e) {
    var $target = $(e.toElement);
    if (!$target.is('input')) {
      console.log($target);
      var $cb = $('input[type="checkbox"]', $(this)),
        is_on = $cb.is(':checked');
      if (is_on) {
        //if its already checked, uncheck it
        $cb.prop('checked', false);
      } else {
        //if its not checked, check it
        $cb.prop('checked', true);
      }
    }
  });
});

请稍等一下,看看是否有更好的解决方案

答案 2 :(得分:0)

您可以将您正在收听的元素更改为文本,如下所示:

&#13;
&#13;
$(".selector").click(function() {
  $(this).parent().find(".chkbox").trigger("click");
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="not-working">
  <h3>
  Click the text, then click the box
  </h3>
  <div data-id="20">
    <div class="col-md-5 selector">Data 20</div>
    <div class="col-md-2">
      <input class="chkbox" type="checkbox" name="selectedDudes[]" value="20" id="checkbox-20">
    </div>
  </div>
  <div data-id="22">
    <div class="col-md-5 selector">Data 22</div>
    <div class="col-md-2">
      <input class="chkbox" type="checkbox" name="selectedDudes[]" value="22" id="checkbox-22">
    </div>
  </div>
</div>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

好的,这是一个使用bootstrap列表组的简洁例子

$(".list-group-item").click(function(event) {
  var target = $(event.target);
  if (target.is("input")) {
    $(this).trigger(click);
  } else {
    $(this).find(".chkbox").trigger("click");
  }
});

<ul class="list-group">
  <li class="list-group-item">
    <input class="chkbox" type="checkbox"> Porta ac consectetur ac
  </li>
</ul>

DEMO