Javascript 为什么选中复选框';美国的状态不变吗?
单击复选框将向服务器发送ajax请求,下面是我如何处理切换:Javascript 为什么选中复选框';美国的状态不变吗?,javascript,jquery,ajax,dom,checkbox,Javascript,Jquery,Ajax,Dom,Checkbox,单击复选框将向服务器发送ajax请求,下面是我如何处理切换: toggleDefault: function(e) { e.preventDefault(); var url = $(e.target).data('target'); var value = $(e.target).attr('checked') ? 0 : 1; $.post(url, {value: value})
toggleDefault: function(e) {
e.preventDefault();
var url = $(e.target).data('target');
var value = $(e.target).attr('checked') ? 0 : 1;
$.post(url, {value: value})
.done(function() {
value ? $(e.target).attr('checked', true) : $(e.target).removeAttr('checked');
})
.error(function() {
alert('There is an error processing request, please try again.');
})
}
禁用事件确实可以正常工作。但是当谈到enable事件时,我可以看到$(e.target).attr('checked',true)
操作更改了复选框dom。但UI上的复选框仍然未选中。
如何解决此问题?您不应该更改属性,它将不起作用。改为更改
属性
(检查“属性与属性”部分):
或者,如果简化,它将只是:
.done(function() {
$(e.target).prop('checked', Boolean(value));
})
还更改了此行var value=$(e.target).attr('checked')?0 : 1;代码>到var值=$(e.target)。是否(':checked')?0 : 1;代码>
希望这能奏效 我对你的代码做了一些编辑。问题是您正在使用e.eventpreventDefault()代码>因此您的:已选中
-切换无法工作。每次调用事件时,浏览器都会将其设置为默认值
$(“#ckb”)。单击(函数(e){
//切换默认值:函数(e){
//e.预防违约();
var url=$(e.target).data('target');
var值=$(e.target).prop('checked')?0:1;
$.post(url,{value:value})
.done(函数(){
如果(值==0){
$(e.target).prop('checked',true);
}否则{
$(e.target).prop('checked',false);
}
})
.错误(函数(){
警报('处理请求时出错,请重试');
})
//}
});代码>
JS-Bin
设置为默认值
谢谢,但我以前试过。问题是:第一次就可以了。但是,当我第二次单击复选框而不刷新页面时,$(e.target).attr('checked')
获得的值将是错误的。请使用prop
属性阅读:$(e.target).prop('checked')
。当您更改/读取checked属性时,它只影响复选框的默认(因此是初始)状态,而不是当前状态。我再次尝试了您的方法,发现复选框的dom以这种方式保持不变。那么您知道如何更改复选框的当前状态吗?或者我必须刷新页面吗?var value=$(e.target)。是否(':checked')?0 : 1;代码>无法获取正确的状态。选中时,您希望0;未选中时,您希望1正确?是这样吗?是的。但我在未选中时得到0。确定然后切换值:var value=$(e.target)。是否(':checked')?1 : 0;代码>这是工作。哇。这就是棘手的部分@MarvinHeilemann和Deepak非常感谢你们两位,谢谢。你能告诉我什么地方我能弄清楚preventDefault
是如何阻止我读取当前状态的吗?
.done(function() {
$(e.target).prop('checked', Boolean(value));
})
.done(function() {
value ? $(e.target).prop('checked', true) : $(e.target).prop('checked', false);
})