Javascript / JQuery取消选择单选按钮

时间:2011-03-09 12:47:41

标签: javascript jquery radio-button

我有以下javascript,我想用它来让用户通过点击取消选择所选的单选按钮。 (我知道这不是标准的,但系统要求它:)

DeselectRadioButton = {
    setup: function () {
        $(".deselectRadioButton").click(function () {
            if ($(this).is(':checked')) {
                alert("I am checked!");
                ($(this).removeAttr('checked'));
            }
        });
    }
};

我的问题是,当我选择一个未选中的单选按钮时,它会在警报显示后立即取消选择它。

我想我在项目更改后收到了这个事件 - 如何修复此代码以使我的单选按钮无法选择?

谢谢!

5 个答案:

答案 0 :(得分:7)

  

然而,主要问题是当我   选择一个未选中的单选按钮,它   之后立即取消选择   警报显示。

似乎无法阻止使用return falsee.preventDefault()的单选按钮的默认行为,因为在单击处理程序被触发时始终会检查单选按钮。解决这个问题的一种方法是在单选按钮中添加一个单独的类,并将其用作指示符。

$(".deselectRadioButton").click( function(e){
    if($(this).hasClass("on")){
       $(this).removeAttr('checked');
    }
    $(this).toggleClass("on");
}).filter(":checked").addClass("on");

jsfiddle上的代码示例。

答案 1 :(得分:3)

我在执行此操作时遇到的挑战之一是使用单选按钮组。解决方案为单个单选按钮提供了出色的工作,但在小组中我遇到了一个问题,即取消选择一个然后尝试选择另一个失败(直到第二次点击)。

我刚刚遇到了一个精彩的解决方案here

var allRadios = $('input[type=radio]')
var radioChecked;

var setCurrent = function(e) {
  var obj = e.target;
  radioChecked = $(obj).attr('checked');
}

var setCheck = function(e) {
  if (e.type == 'keypress' && e.charCode != 32) {
    return false;
  }
  var obj = e.target;
  if (radioChecked) {
    $(obj).attr('checked', false);
  } else {
    $(obj).attr('checked', true);
  }
}    

$.each(allRadios, function(i, val){        
  var label = $('label[for=' + $(this).attr("id") + ']');

  $(this).bind('mousedown keydown', function(e){
    setCurrent(e);
  });

  label.bind('mousedown keydown', function(e){
    e.target = $('#' + $(this).attr("for"));
    setCurrent(e);
  });

  $(this).bind('click', function(e){
    setCheck(e);    
  });
});

答案 2 :(得分:2)

尝试:

$(this).removeAttr('checked');

答案 3 :(得分:1)

我遇到了David用单选按钮组描述的相同问题。这是解决该问题的另一种方法(基于Mark的解决方案),适用于同一页面上的多个单选按钮组:

$(":radio").click( function(e){
    var itsOn = $(this).hasClass("on");
    $(":radio[name="+ this.name + "]").removeClass("on");
    if(itsOn){
      $(this).removeAttr('checked');
      $(this).siblings().filter("[value='']").attr('checked', true);
    } else {
      $(this).addClass("on");
    }
  }).filter(":checked").addClass("on");

答案 4 :(得分:0)

你确定没有别的东西搞砸了吗?

我尝试了这段代码,但它确实有效:

HTML

<ul>
    <li>
        <input id="one" name="value" type="radio">
        <label for="one">One</label>
    </li>
    <li>
        <input id="two" name="value" type="radio">
        <label for="two">Two</label>
    </li>
    <li>
        <input id="three" name="value" type="radio">
        <label for="three">Three</label>
    </li>
</ul>

的JavaScript

$("input[type='radio']").click(function(event) {
    // If the button is selected.
    if ($(this).hasClass("checked")) {
        // Remove the placeholder.
        $(this).removeClass("checked");
        // And remove the selection.
        $(this).removeAttr("checked");
    // If the button is not selected.
    } else {
        // Remove the placeholder from the other buttons.
        $("input[type='radio']").each(function () {
            $(this).removeClass("checked");
        });
        // And add the placeholder to the button.
        $(this).addClass("checked");
    }
});

您可以对其进行测试here