我遇到了一个相当奇怪的行为。我有两个页面(我们称它们为页面 A和页面 B),两个页面都包含以下 javascript 代码:
<script type="text/javascript">
$(document).ready(function(){
$('a > img.id-provider, #signup-button').click(function(e){
if (!$('#chk-agree').attr('checked')) {
alert('Please accept our terms and conditions before continuing');
}
else {
alert('ok');
}
e.preventDefault();
});
});
</script>
该页面可在此处查看:http: //jsfiddle.net/SrRAS/
在页面 B 上,行为符合预期,即在单击注册按钮之前未选中复选框时会发出警告。
但是,在页面 A 上,始终会显示警告,即使已手动单击复选框以使其选中。
这是 FF 控制台输出(对于两个页面),当我试图了解发生了什么时:
>>> $('#chk-agree').attr('checked')
undefined
>>> $('input#chk-agree').attr('checked')
undefined
最终,在页面 A 上,我决定以编程方式设置选中的属性(而不是像普通用户那样手动单击它):
>>> $("input#chk-agree").click()
jQuery(input#chk-agree, input#chk-agree)
>>> $("input#chk-agree").attr('checked')
"checked"
然后,当我单击页面 A上的注册按钮时,它按预期工作(显示“确定”消息)。但是,当我手动取消选中页面 A上的复选框时,它仍然继续显示“确定”消息。因此,似乎出于某种原因,在页面 A上,手动单击复选框不会切换“已选中”属性。
我有两个问题:
- 为什么手动检查复选框不切换复选框“已选中”属性
- 什么会导致代码在一页而不是另一页上按预期工作?
[[编辑]]
I have also tried the following check instead of the one shown in my snippet above:
if (!$(this).is(':checked')/*!$('#chk-agree').attr('checked')*/) {
...
}else {
...
}
现在,至少两个页面的行为是一致的,当手动单击复选框时,似乎没有一个页面(A 或 B)承认 - 到底发生了什么?!
[[编辑2]]
无效页面的标记在这里:http: //jsfiddle.net/SrRAS/
我将非常有兴趣找出导致它在此页面上不起作用的原因。