我有一组具有相同name
的单选按钮,其中一些可能被禁用。我不希望用户选中或取消选中已禁用的单选按钮。显然,这意味着如果禁用了组中已选中的单选按钮,则用户无法更改选择。
我为此编写了以下代码。
$("#container").delegate(":radio","click",function(e){
alert($(":radio").filter(":checked").val());
//this always shows up the value of the radio button clicked
if($(":radio").filter(":checked").is(":disabled"))
{
e.preventDefault();
}
});
我想问题是,只要单击单选按钮,选择就会更改并执行事件处理程序,.preventDefault()
将恢复选择。
我希望它很清楚
这是jsFiddle
答案 0 :(得分:2)
你可以这样做:
$('#container :radio:checked:disabled').parent().delegate(":radio","click",function(e){
e.preventDefault();
});
答案 1 :(得分:2)
另外两个答案到目前为止还没有处理无线电组。
我在与是()
的问题的战斗之后完成了这项工作我在 中遇到语法错误(“:已检查”) 或者jQuery对于已禁用但已检查的无线电不返回true - 如果点击其他无线电暂时从其他无线电中删除已检查的javascript布尔值而不实际删除已检查的属性,这将解释它。
工作示例
短版:无法处理多个已禁用的
$("#container :radio").click(function(e){
var disR = $("#container input[name="+$(this).attr("name")+"]")
.filter(":disabled");
if (disR.length > 0 && disR.attr("checked")==="checked") {
e.preventDefault();
return false
}
});
更长的版本: - 现在,包装每个广播组并使用其他建议越来越有趣
http://jsfiddle.net/mplungjan/HQs6s/
$("#container :radio").click(function(e){
var radioGroup = $("#container input[name="+$(this).attr("name")+"]");
var disR = radioGroup.filter(":disabled"); // cannot use :checked
if (disR.length == 0) return true;
for (var i=0,n=disR.length, chk;i<n;i++) {
chk = disR[i].getAttribute("checked");
if (chk && chk==="checked") { // html element
e.preventDefault();
return false;
}
}
});
答案 2 :(得分:1)
在点击事件中:$(":checked")
指向已点击的广播,而不是已点击的广播。 preventDefault()
确定点击的广播是否会保持点击状态。所以你可能想做这样的事情:
function attachMyNoClick() {
if ($("#container :radio").filter(":checked").is(":disabled")) {
$("#container :radio").bind("click.MyNoClick", false);
}
else {
$("#container :radio").unbind("click.MyNoClick");
}
}
$(document).ready(function() {
attachMyNoClick
});
如果有jQuery代码更改了单选按钮的禁用状态,则应该将上述函数挂钩到该函数中。您必须首先unbind()
点击事件,然后bind()
必要时点击事件。
注意:即使选中了已禁用的单选按钮也不会提交。