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中的一个奇怪的错误。 检查/设置属性defaultChecked和checked 。 在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'))