javascript - 当同时使用 PreventDefault 时,单选按钮检查属性未设置

标签 javascript jquery html radio-button preventdefault

我遇到的问题是,我的场景中的单选按钮在单击时未被选中。我创建了一个JSFiddle显示代码和问题。

无论出于何种原因,我都有一个被元素包围的整个区域。

<a href="/link">
    //some stuff
    <div class="protected">
        <input type="radio" name="b1" value="1" /> Button 1
        <input type="radio" name="b1" value="2" /> Button 2
    </div>
    //some stuff
</a>

此标记内有一小部分需要保护,以免受到链接默认行为的影响。此部分包含一些需要可选择的 radio 输入。

按照我目前的方式,我使用事件监听器来保护“ protected ”部分,并且:

$('.protected').off('click').on('click', function (e) {
    e.preventDefault();
});

我还在单选按钮上有一个事件监听器,以便我可以在单击它们时执行属性更改。

$('.protected > :radio').off('click').on('click', function (e) {
    $(this).siblings(':radio').removeAttr('checked');
    $(this).attr('checked', 'checked');
});

不幸的是,这是在 dom 中设置选中属性,但是单选按钮并未在用户的屏幕上填写。

任何帮助将不胜感激。

最佳答案

您需要添加stopPropagation()

$('.protected > :radio').off('click').on('click', function (e) {
    e.stopPropagation();
    
    //$(this).siblings(':radio').removeAttr('checked');
    //$(this).attr('checked', 'checked');
});

另外,请务必注释掉

$(this).siblings(':radio').removeAttr('checked');
$(this).attr('checked', 'checked');

您不需要它们,因为浏览器会为您处理此问题。

DEMO

发生的情况是,由于容器单击处理程序中有 preventDefault,因此嵌套单击事件会传播到该单击处理程序,并阻止设置单选按钮。

关于javascript - 当同时使用 PreventDefault 时,单选按钮检查属性未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30496564/

相关文章:

javascript - 单击两次时 .focus() 不聚焦

jquery - 'first' 伪类有什么意义吗?

jquery - Angular js加载文件并将内容放入div中

html - 跨 http/https 清除 html5 sessionStorage

javascript - 编写一个我可以重新使用来表示 CurrentUser 的类的最佳方法

javascript - 如何通过worker_thread.Worker传递带函数的类实例来使用函数?

javascript - nodejs(libuv)事件循环是否在一个阶段(队列)中执行所有回调,然后再移动到下一个阶段或以循环方式运行?

javascript - 日期选择器设置默认日期

php - 限制包含 HTML 标签的文本的输入长度

javascript - 过滤表 Jquery 的第一列