【问题标题】:change checkbox status (true/ false) on div click在 div 点击时更改复选框状态(真/假)
【发布时间】:2013-07-04 08:43:56
【问题描述】:

我有具有图像、标签和输入复选框的 div。当我点击 div 时,我喜欢什么,它会将复选框状态从 true 更改为 false 和虎钳

jQuery

$(".markerDiv").click(function () {

    if ($(this).find('input:checkbox[name=markerType]').is(":checked")) {

          $(this).find('input:checkbox[name=markerType]').attr("checked", false);
    }
    else {
          $(this).find('input:checkbox[name=markerType]').attr("checked", true);
    }


 alert($(this).find('input:checkbox[name=markerType]').is(":checked"));
});

html

<div class="markerDiv"  id="maker_school"><label class="marker_label">School</label> <input class="marker_ckeckbox" name="markerType" value="school" type="checkbox"  /> </div> <br />

【问题讨论】:

  • yh 但是当您继续点击学校时,它会停止运行...
  • 您的目标是哪个版本的 IE?您可以使用 :checked 伪类在纯 css 中执行此操作
  • 评论接受的答案为什么你选择它而不是其他人的

标签: jquery html checkbox


【解决方案1】:

您可以使用children('input[type="checkbox"]')选择器选择复选框并使用以下代码更改其状态

$('.markerDiv').on('click', function(){
   var checkbox = $(this).children('input[type="checkbox"]');
   checkbox.prop('checked', !checkbox.prop('checked'));
});

【讨论】:

  • 为什么建议children 而不是find
  • @TecHunter 因为checkbox 元素是.markerDiv 的直接子元素。如果它在树的更深处,我会使用find。我不确定这方面的性能,但我会对此进行一些研究。
  • 如果您有值参数,那就太好了 :) +1
  • 浏览了一会儿,我发现this sitefindchildren之间测试性能,看起来find在如此高的元素数量下确实更快。但是,在这种情况下,元素数量很少,我想我们可以参考this sitechildren 更快。无论如何,这是一个有趣的研究课题,但我想在这种情况下,深入研究并不重要。 :P
  • 不错的收获!确实很有趣的话题
【解决方案2】:

您无需编写任何 javaScript/jQuery 方法即可完成。

只需将 div 包裹在标签内:-

div {
  background: red;
  padding: 10px 40px;
}
<label for="myCheck">
  <div>
    <input id="myCheck" type="checkbox" />Remember Me!
  </div>
</label>

【讨论】:

【解决方案3】:

最简单的解决方案是将复选框放在标签内。这样,就不需要 JS/jQuery。

如果您不能/不想这样做,您可以执行以下操作:-

$(".markerDiv").click(function (e) {    
    if (!$(e.target).is('input:checkbox')) {
        var $checkbox = $(this).find('input:checkbox');
        $checkbox.prop('checked', !$checkbox.prop('checked'));
    }
});

这与您已经拥有的几乎相同。除了它使用prop()。您的无法正常工作的原因是因为当您使用.attr() 获取选中的属性时,它指的是defaultChecked 状态,而不是当前状态。

来自documentation

尽管如此,关于检查的最重要的概念是要记住的 属性是它不对应于选中的属性。这 属性实际上对应于 defaultChecked 属性和 应该只用于设置复选框的初始值。

其中唯一的另一件事是if 语句,它检查您是否单击了复选框本身。默认行为会干扰单击处理程序,因此最简单的解决方案是仅在未单击复选框时以编程方式检查复选框,否则将其保留为默认行为。

希望这是有道理的,

Here's a fiddle

【讨论】:

  • 这个解决方案是最简单的,而且确实有效。直接单击复选框也可以。谢谢
【解决方案4】:

您需要使用.prop('checked',true) 而不是.attr()。在这里查看:http://jsfiddle.net/techunter/VQ5E2/

或与.attr 一起使用attr.('checked','checked').removeAttr('checked')。这里 : http://jsfiddle.net/techunter/SaRmW/

这里优化了代码:

$(".markerDiv").click(function () {
    var $checks = $(this).find('input:checkbox[name=markerType]');

    $checks.prop("checked", !$checks.is(":checked"));

    alert($checks.is(":checked"));
});

http://jsfiddle.net/techunter/YymBH/

【讨论】:

  • 虽然我推荐使用.prop
  • 还要注意使用局部变量而不是重复选择器
  • 这些解决方案不允许直接点击复选框
【解决方案5】:

按照您在本博客中的指导使用道具。由于您的复选框在 div 中并且因为 div 注册了点击事件,它可能会阻止您使用复选框。使用 e.stopPropagation 使复选框本身也可以点击。

$('.markerDiv').click(function () {

  if ($(this).find('input:checkbox[name=markerType]').is(":checked")) {

    $(this).find('input:checkbox[name=markerType]').attr("checked", false);
  }
  else {
      $(this).find('input:checkbox[name=markerType]').prop("checked", true);
  }

   alert($(this).find('input:checkbox[name=markerType]').is(":checked"));
});


 $('input[type=checkbox]').click(function (e) {
     e.stopPropagation();
 });

【讨论】:

  • 和上面的一样,不要混用 attr 和 prop
【解决方案6】:

HTML 元素 'label' 中有一个属性 'for'。

<div class="markerDiv"  id="maker_school">
    <label class="marker_label" for="markerType">School</label> 
    <input class="marker_ckeckbox" id="markerType" name="markerType" value="school" type="checkbox"  /> 
</div>

这里是一个例子:http://jsfiddle.net/bH3jJ/

您必须在 'input[type="checkbox"]' 元素中设置 'id' 属性,然后将此 id 传递给 'label' 元素中的属性 'for'。

编辑:

如果你喜欢使用 jQuery,这里是解决方案:

$(".markerDiv").click(function () { 
    var checkBox = $('input[name=markerType]', this);

    $(checkBox).prop('checked', !checkBox.is(':checked'));
});

使用您的 HTML 标记:

<div class="markerDiv" id="maker_school">
    <label class="marker_label">School</label>
    <input class="marker_ckeckbox" name="markerType" value="school" type="checkbox"  />
</div>

示例:http://jsfiddle.net/QgEL8/1/

【讨论】:

  • 没有标签,一切工作正常,即使在警报中我正在获取复选框 onclick 的当前值,只是没有在 markerDiv 点击上更改为 true 或 false
  • 标签有效吗?当您单击标签时,它会切换复选框?我不认为它会起作用。单击标签不是您要尝试的工作吗? div 中没有其他内容。
  • 顺便说一句,您可以将&lt;input&gt; 标签嵌套在&lt;label&gt; 标签内。无论您是这样做还是使用for 属性,然后单击标签都会自动切换复选框。为此,您不需要 任何 JavaScript 代码。
  • 你说得对,我必须使用 input:checkbox[name=markerType] 作为问题
  • 我没有告诉你把 放在标签里面。我的答案中有两种解决方案,您可以使用它们。即使您不想使用纯 HTML 标签和输入,您也可以了解如何编写 JS 代码。无论如何,我认为这比您的示例要好,但是您可以思考并做您想做的事,我只是想给您答案。我希望你已经找到了解决方案,而且我的回答还不错。
【解决方案7】:

我遵循了 TecHunter 和 khurram 的建议。

1) 不要通过仅使用属性属性来混合属性和属性,但仅使用它会阻止输入复选框可点击行为,因此

2) 所以使用单独的函数;使用 click 事件注册 input[type=checkbox],然后使用 e.stopPropagation() 这将确保复选框可点击本身的运行

$('.markerDiv').click(function () {

    var $checks = $(this).find('input:checkbox[name=markerType]');

     $checks.prop("checked", !$checks.is(":checked"));

       //process my data here

 });

$('input[type=checkbox]').click(function (e) {

    e.stopPropagation();

      //process my data here
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多