1

看看这个小提琴:http: //jsfiddle.net/5rmEe/61/

    var inputVal = false;
    //allow user to deselect a radio button by clicking a checked radiobutton
    $('input[type=radio]').each(function(){
      var inputObj = $(this);
      inputObj.click(function(e){
        if(inputVal === inputObj.val()){
          inputVal = false;
          inputObj.attr('checked', false);
        }
        else{
          inputVal = inputObj.val();
          inputObj.attr('checked', 'checked');
        }
        e.stopPropagation();
      });
    });

$('.asdf').click(function(){
    $('.haha').trigger('click');
});

请注意 asdfsdaf 跨度会触发单击单选按钮

首先,单选按钮设置为,如果您单击选中的单选按钮,它将取消选中自身(尝试一下),并且在单击单选按钮本身时有效

现在,如果您单击跨度,它将使复选框正确地检查自身,但是如果您再次单击跨度,它将不会将单选按钮设置为未选中,即使它显然执行了单击事件,理论上它应该取消选中单选由于单击事件而相应地按钮(如果您实际单击单选按钮,则此事件有效)

为什么会这样?如果使用 .trigger() 手动触发事件,attr() 方法是否不起作用?

我该如何解决这个问题,以便在选中单选按钮时单击跨度也会触发单选按钮中的取消选中?

4

2 回答 2

3

使用triggerHandler而不是trigger.

$('.haha').triggerHandler('click');

这将导致处理程序被触发,而不会导致单击的默认行为。

于 2012-10-24T21:31:27.803 回答
0

您可以通过在单击处理程序中调用来阻止默认单击操作preventDefault(),如下所示:

 inputObj.click(function(e){
        e.preventDefault(); //add this to prevent default click behaviour 
        if(inputVal === inputObj.val()){
          inputVal = false;
          ...
          ...

见工作小提琴

于 2012-10-24T21:42:17.460 回答