Javascript 按动态更改的属性选择元素

Javascript 按动态更改的属性选择元素,javascript,jquery,forms,dynamic,radio,Javascript,Jquery,Forms,Dynamic,Radio,由@Grundy解决,帖子底部的解决方案 我有一个带有单选选项的表单,其中的元素是以编程方式选择的,用户无需直接单击单选元素 var $elem = $("input[name=type][value^=foo_]"); // Select the element with name "type" where the value starts with "foo_" (assume only one value is ever found) if ($elem.length > 0) //

由@Grundy解决,帖子底部的解决方案

我有一个带有单选选项的表单,其中的元素是以编程方式选择的,用户无需直接单击单选元素

var $elem = $("input[name=type][value^=foo_]"); // Select the element with name "type" where the value starts with "foo_" (assume only one value is ever found)
if ($elem.length > 0) // If element is found then toggle the checked value of the radio value
{
    $("input[name=type][checked=checked]").attr("checked", false); // Uncheck all existing checked items
    $elem.attr("checked", true); // Check the found element from before
}
这是可行的,我可以在Chrome的开发者工具中看到属性的变化。先前选中的输入将被取消选中,相应的项将被选中。这种方法每次都有效,特别是多次有效(我将在后面解释为什么这是相关的)

接下来,我隐藏所有未选中的单选按钮,只显示选中的一个

$("input[name=type] + label").hide();
$("input[name=type]:checked + label").show();
这在第一次选择输入时起作用。所有未检查的输入将被隐藏,而已检查的输入将被取消隐藏。如果第二次选择输入(立即再次选择或在中间选择其他选项之后),则所有输入都将隐藏,包括选中的输入

$("input[name=type] + label").hide();
$("input[name=type]:checked + label").show();
如果我检查
$(“input[name=type]:checked+label”)
的匹配元素数,它将第一次返回
1
,第二次返回
0
,这意味着只有在第二次之后才会选择它。我觉得这是因为
checked
属性在那一点上被动态更改,但这可能不是问题的原因

编辑-这是一把小提琴 当用户单击值时,单击灰色框将显示其正常行为。可以按任意顺序多次选择每个值,但如果单击底部的文本(它们是外观不佳的按钮),将以编程方式更改表单。它只是第一次工作,它似乎并不关心用户以前是否选择了它

解决方案-信贷@Grundy 因为我知道我之前找到的
$elem
对象是正在更改的对象,所以我可以直接引用它,而不是尝试搜索带有
选中的
属性的元素。所以我用这个:

var $elem = $("input[name=type][value^=foo_]"); // Created before all the changes
$elem.next("label").show(); // Referenced after all the changes
而不是使用这个:

$("input[name=type]:checked + label").show(); // Referenced after all the changes
试用

$elem.next("label").show();
而不是

$("input[name=type]:checked + label").show();

由于
$elem
是您找到的复选框,因此我不确定您是否可以在元素隐藏时更改复选框的状态。请提供一个..@sdespont Chrome的开发工具,即使在元素隐藏时也会显示属性更改。问题似乎是通过
checked
属性来选择该元素。@bios我现在要用小提琴了。@sdespont-我认为即使复选框是隐藏的,您也可以更改其状态。仍然不确定为什么我的方法不起作用,但你的方法起作用,这解决了我的问题,所以谢谢你的建议!把你的答案标记为正确。