如何在jQuery中的互斥复选框上实现click事件?

时间:2012-04-19 15:14:14

标签: javascript jquery javascript-events

我有两个复选框:

<input id="outside" type="checkbox" value="1" data-gid="41820122" />
<input id="inside" type="checkbox" value="1" data-gid="41820122" />

我让他们互相排斥:

$(function(){
  //mutually exclusive checkboxes
  $("input[data-gid]").click(function(){
    var gid = $(this).attr('data-gid');
    var fid = $(this).attr('id');
    var checkboxes = $("input[data-gid=" + gid + "][id!=" + fid + "]");
    checkboxes.attr("checked", false);
   });
});

这很好用。但我还想在“内部”复选框中添加额外的点击功能。我希望它在同一个表单上启用/禁用textarea,所以我已经这样做了:

$('#application_inside').click(function() {
        if ($(this).is(':checked')) {
          return $('textarea').removeAttr('disabled');
        } else {
          return $('textarea').attr('disabled', 'disabled');
        }
 });

因此,如果选中'inside'复选框,则会启用textarea,如果未选中,则应禁用textarea。

问题是如果选中'inside'复选框,然后用户检查'outside'复选框,则'inside'将被取消选中(应该是),但textarea仍保持启用状态。这似乎是因为“内部”复选框从未被用户实际点击过。

我尝试过以下方法解决这个问题:

$(function(){
  //mutually exclusive checkboxes
  $("input[data-gid]").click(function(){
    var gid = $(this).attr('data-gid');
    var fid = $(this).attr('id');
    var checkboxes = $("input[data-gid=" + gid + "][id!=" + fid + "]");
    checkboxes.attr("checked", false);
    checkboxes.triggerHandler("click"); //new code to fire any click code associated with unchecked boxes
   });
});

但这只是将浏览器抛入循环,因为两个不同的点击事件最终会相互调用。

如何在仍然允许“内部”复选框的启用/禁用代码工作的同时保留我的互斥代码?

2 个答案:

答案 0 :(得分:1)

您可以创建在 #application_inside 点击时触发的自定义事件。此外,当您取消选中其他框时,您将触发此自定义事件,因为它具有排他性。

以下是一个示例:http://jsfiddle.net/gs78t/2/

答案 1 :(得分:0)

你可以尝试这样的事情

var insideChanged = function() {
    if ($('#inside').is(':checked')) {
      return $('textarea').removeAttr('disabled');
    } else {
      return $('textarea').attr('disabled', 'disabled');
    }
};

$('#application_inside').click(insideChanged);

$(function(){
  //mutually exclusive checkboxes
  $("input[data-gid]").click(function(){
   var gid = $(this).attr('data-gid');
    var fid = $(this).attr('id');
    var checkboxes = $("input[data-gid=" + gid + "][id!=" + fid + "]");
    checkboxes.attr("checked", false);
    insideChanged(); //new code to fire any click code associated with unchecked boxes
   });
});