【问题标题】:jquery-ui buttonset click event doesn't seem to change the checked statejquery-ui buttonset 点击事件似乎没有改变选中状态
【发布时间】:2015-10-16 15:45:36
【问题描述】:

我正在使用带有 2 个单选按钮的 jquery-ui 按钮集,用于输入是/否。

var yesInput = document.createElement("input");
yesInput.type = "radio";
$(yesInput).attr('id', "njs1");
$(yesInput).prop('checked', this._data);

var noInput = document.createElement("input");
noInput.type = "radio";
$(noInput).attr('id', "njs2");
$(noInput).prop('checked', !this._data);

我在这些按钮和处理函数中调用更改事件,试图检测是否单击了选中的按钮。 buttonSet 是被制成buttonset() 的div。

$("input[type=radio]", buttonSet).change(checkHandler);

var data= $("input[type=radio]", buttonSet).eq(0).is(':checked');

在这种情况下,我预计如果单击第二个按钮,数据应该返回 false。我的理解是当我检查收音机时,它的 html 被修改为添加checked

但是,无论调用什么,数据始终是true

我做错了什么?如何得到正确的值?

编辑:

Example fiddle

如您所见,我可以单击“否”并仍然选中“是”。因为它是一台收音机,我希望它会表现得那样

【问题讨论】:

  • 你能提供一个jsfiddle.net上的代码示例吗?
  • jsbin.com/wuhozayevo/edit?html,js,output 我不确定为什么按钮集没有按应有的方式呈现,但这不是问题,因为它很可能是 jsbin 特有的。如您所见,我可以单击“否”并仍然选中“是”。既然它是一台收音机,我希望它会表现得那样。
  • 几个问题:1) 单选输入元素应该有一个具有相同值的name 属性,以便它们被链接,以确保只能选择yesno。 2) 我看到 vanilla js 和 jQuery 代码的混合使用; vanillajs 在您的代码中的目的是什么? 3) 不确定$(buttonSet).buttonset(); 做了什么。这是一些jquery插件吗? 4) 您在示例中同时加载 jquery 1.x 和 2.x。
  • 谢谢。我删除了对旧 jquery 库的引用。我使用 vanilla js 只是因为,我有一个函数可以传递容器 div,该容器 div 将按钮集作为参数。这就是为什么我想让它尽可能分开。官方 jquery-ui 文档建议使用 $(buttonSet).buttonset(); 并在示例中显示相同。 api.jqueryui.com/buttonset/#method-option
  • @chimurai 更改后,它看起来应该如此。但是,同时检查两者的相同问题(即使添加了name 属性)仍然存在。

标签: javascript jquery jquery-ui jquery-ui-button


【解决方案1】:

为什么不使用 jQuery 创建元素的方式呢? 使用单选按钮的点击事件。

$('<input/>').attr({type: "radio", "id": "njs1"})
.prop("checked", !this._data)
.click(checkHandler);

【讨论】:

  • 按照建议更新了代码。我仍然面临同样的问题。
  • 尝试使用 removeAttr("checked") 取消选中。
  • 但是,我并没有取消选中我的处理程序。我在定义输入时设置了一个初始状态。 jquery 不处理这个吗?
【解决方案2】:

要更改输入元素的选中状态,您必须使用.prop()

设置为选中: $( "input" ).prop( "checked", true );

设置为未选中: $( "input" ).prop( "checked", false );

http://api.jquery.com/prop/

在 jQuery 1.6 之前的 .attr 确实改变了 html 属性和 dom 属性。

从 v1.6 开始,此行为已更改。

属性和属性之间的区别在 具体情况。在 jQuery 1.6 之前,.attr() 方法有时 在检索某些属性时考虑了属性值, 这可能会导致不一致的行为。从 jQuery 1.6 开始,.prop() 方法提供了一种显式检索属性值的方法,而 .attr() 检索属性。

更新

两个无线电输入应具有完全相同的值才能将它们组合在一起。

$(yesInput).attr('id', "njs1"); $(yesInput).attr('name', "toggle"); // << shared name $(noInput).attr('id', "njs2"); $(yesInput).attr('name', "toggle"); // << shared name

【讨论】:

  • 我更新到最新的jquery并切换到prop,仍然发生同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多