【问题标题】:Programmatically deselecting a radio button by clicking its label通过单击标签以编程方式取消选择单选按钮
【发布时间】:2011-12-09 17:29:53
【问题描述】:

我正在寻找一个允许我取消选择单选按钮的脚本。我在 SO 上找到了一个并在这里实现了它......

http://jsfiddle.net/sparky672/YFsVK/1/

如您所见,它运行良好,但仅当您单击单选按钮本身时。 (您也可以通过单击相应的<label> 文本来“选择”一个按钮。这是<label> 默认的操作方式。)

但是,我还需要能够通过单击相应的<label> 来“取消选择”一个单选按钮,这就是我需要帮助的地方。

(为什么?因为我正在使用一个插件,它使用包含在覆盖默认单选按钮的 <label> 中的图像精灵以图形方式改变单选按钮的外观。我的 jsFiddle 中有一行可以激活来查看插件的运行情况。)

我确定我只需要稍微调整一下这个脚本,但我似乎无法让它正确。我相信我只需要在操作相应的单选按钮时“选择”<label>。通过将按钮的id 放置在相应<label>for 属性中,<label> 被“附加”到按钮。

JavaScript:

$(document).ready(function() {

    $('input[name="amount"]').mousedown(function(e) { // allows radio button deselection
        var $self = $(this);
        if ($self.is(':checked')) {
            var uncheck = function() {
                setTimeout(function() {
                    $self.removeAttr('checked');
                }, 0);
            };
            var unbind = function() {
                $self.unbind('mouseup', up);
            };
            var up = function() {
                uncheck();
                unbind();
            };
            $self.bind('mouseup', up);
            $self.one('mouseout', unbind);
        }
    });

});

HTML:

<fieldset id="radioset">
    <input type="radio" id="radio-1" name="amount" value="Option 1" /><label for="radio-1" title="">Option 1</label><br />
    <input type="radio" id="radio-2" name="amount" value="Option 2" /><label for="radio-2" title="">Option 2</label><br />
    <input type="radio" id="radio-3" name="amount" value="Option 3" /><label for="radio-3" title="">Option 3</label><br />
    <input type="radio" id="radio-4" name="amount" value="Option 4" /><label for="radio-4" title="">Option 4</label><br />
    <input type="radio" id="radio-5" name="amount" value="Option 5" /><label for="radio-5" title="">Option 5</label>
</fieldset>

【问题讨论】:

  • 奇怪的是,this 不起作用...
  • @alex,但它看起来应该工作。
  • 它使用相同的this 引用调用相同的函数,所以我不知道。很奇怪。
  • 我认为这是因为单选按钮在mouseup 事件之后更新,而上面的函数是在mousedown 上调用的,所以基本上它取消了更改。

标签: jquery radio-button label fieldset


【解决方案1】:

我还尝试了@Jrod 所做的,发现插件不起作用。所以我修改了插件。基本上将其添加到标签中:

.bind('mouseup', function(){
    if ($(this).is('.checked') && input.is(':radio')) {
        setTimeout(function(){
            label.removeClass('checked focus');
            input.removeAttr('checked').blur();
        }, 0);
    }
});

这是updated demo

【讨论】:

  • 这是很棒的工作!有没有办法将参数传递给插件以打开/关闭它?因为,我也将这个插件用于我不想取消选择的单选按钮。
  • 这是一个带有参数radioToggleupdated version,将其设置为true 以外的任何值以禁用切换。
  • 很抱歉,由于修改插件引起了新问题。 TypeError: Result of expression 'option' [undefined] is not an object..customInput(); 导致错误,但 .customInput({ radioToggle: true });.customInput({ radioToggle: false }); 不是。当我单击单选按钮时,它会在控制台中弹出......尽管出现错误,它们似乎仍在运行,但如果可能的话,我想清理它(不想需要参数)。谢谢!
  • 对不起,试试这个version...基本上我改了这一行:if (option &amp;&amp; option.radioToggle === true) {
  • 我在一个项目中使用了这段代码 sn-p,最近更新到 jQuery 3.1.1,这需要进行一些更改 - bind() 现在已弃用,所以我改用 on()。同样,removeAttr(),虽然它继续删除输入上的检查属性,但似乎不再影响底层检查值,所以我不得不切换该行以使用 input.prop('checked', false) 而不是 input .removeAttr('检查')。我希望这可以帮助任何希望使用更高版本的 jQuery 实现这一点的人。
【解决方案2】:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
    $(document).ready(function() {

        $(".radio-label").click(function(e) {

            var radio = $(this).attr("for");
            radio = $("#" +radio );
            if(radio.is(":checked")) {
                e.preventDefault();
                radio.removeAttr("checked");
            }

        });

    });
</script>
</head>
<body>
<fieldset id="radioset">
    <input type="radio" id="radio-1" name="amount" value="Option 1" /><label class="radio-label" for="radio-1" title="">Option 1</label><br />
    <input type="radio" id="radio-2" name="amount" value="Option 2" /><label class="radio-label" for="radio-2" title="">Option 2</label><br />
    <input type="radio" id="radio-3" name="amount" value="Option 3" /><label class="radio-label" for="radio-3" title="">Option 3</label><br />
    <input type="radio" id="radio-4" name="amount" value="Option 4" /><label class="radio-label" for="radio-4" title="">Option 4</label><br />
    <input type="radio" id="radio-5" name="amount" value="Option 5" /><label class="radio-label" for="radio-5" title="">Option 5</label>
</fieldset>
</body>
</html>

【讨论】:

猜你喜欢
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 2021-12-18
  • 1970-01-01
  • 2010-12-04
  • 2012-12-13
  • 2012-06-08
相关资源
最近更新 更多