jQuery / Javascript:单击复选框上的事件和“已检查”属性

代码:

$('input.media-checkbox').live('click', function(e){ e.preventDefault(); var that = $(this); if (that.attr('checked') == 'checked'){ var m = that.attr('media'); var mid = 'verify_' + m; that.parents('div.state-container').find('ul.' + mid).remove(); that.attr('checked', false); } else { var url = AJAX_URL; $.ajax({ type: 'GET', url: url, dataType: 'html', success: function(data){ that.parents('li').siblings('li.verification').children('div.media-verification').append(data).fadeIn(500); that.attr('checked', 'checked'); } }); } return false; }); 

我在一个表单中ajaxing,然后在相关的复选框上触发click事件到另一个部分的ajax,如果有必要的话。 很好地插入表单,并触发单击事件,检查需要检查的框并触发第二个ajax,因为复选框的checked属性最初为false

如果我取消其中一个盒子,我的奶酪是什么? 尽管有e.preventDefault() ,但在测试之前, checked属性设置为false ,因此if语句始终执行else语句。 我也用$.is(':checked')试过这个,所以我完全不知所措。

看来unchecked – > checked状态读取原始状态,但是选中 – > unchecked则没有。 有帮助吗?

是的,我知道已经过了一年,但我想我找到了解决方案,

这里的问题是实际调用click事件并在“checked”属性添加到复选框输入之前运行。 因此该函数运行,查看输入是否具有“checked”属性,并运行else条件。 然后该元素被赋予“已检查”属性。

我也碰到了这个,我的解决方案是将函数绑定到更改函数而不是单击函数,因为更改仅在输入更新checked属性后触发。

希望这可以帮助你,如果没有,那么在遇到类似问题时碰巧偶然发现这篇文章的其他人。

好吧,对。 你已经设置了live事件,所以我认为你的脚本可能也会响应将其设置为已选中,但我不能完全告诉你在这里尝试的是什么而没有看到标记,但这是我的重写。

 $('input.media-checkbox').live('click', function(e){ if ($(this).is(':checked')) { var m = $(this).attr('media'); var mid = 'verify_' + m; $(this).parents('div.state-container') .find('ul.' + mid) .remove(); $(this).attr('checked', false); } else { var url = AJAX_URL; var that = this; $.ajax({ type: 'GET', url: url, dataType: 'html', success: function(data) { $(that).parents('li') .siblings('li.verification') .children('div.media-verification') .append(data) .fadeIn(500); $(that).attr('checked', true); } }); } return false; }); 

尝试使用e.stopPropagation()而不是e.preventDefault() ,并删除return false 。 在jQuery中返回false等同于e.stopPropagation() + e.preventDefault()e.preventDefault()可以防止选中复选框。

这似乎是由于异步请求。 在成功回调激活之前,执行过了$.ajax 。 当您再次单击该复选框时,前一个请求的回调尚未更新其状态。 您可以尝试在触发ajax调用之前禁用复选框控件,并在成功回调中再次启用它:

 that.attr("disabled", "disabled"); var url = AJAX_URL; $.ajax({ type: 'GET', url: url, dataType: 'html', success: function(data){ that.parents('li').siblings('li.verification').children('div.media-verification').append(data).fadeIn(500); that.attr('checked', 'checked'); that.removeAttr('disabled'); } }); 

这将确保连续两次点击不会导致不可预测的行为。 另一种方法是使用同步请求,即async: false但这将阻止整个浏览器的持续时间。

我认为这是由于IE中的一个奇怪的错误。 检查/设置属性defaultCheckedchecked 。 在if条件下尝试这个,

 if (that.attr('checked')=='checked' || that.attr("defaultChecked")=='checked'){ var m = that.attr('media'); var mid = 'verify_' + m; that.parents('div.state-container').find('ul.' + mid).remove(); that.attr('checked', false); that.attr('defaultChecked', false); } else { 

这可能只是部分答案,但在您的测试中, $(this).attr('checked')如果选中则返回true否则返回false 。 所以只需将条件更改为if (that.attr('checked'))