jQuery的attr()方法的行为
jQuery的attr()方法的行为
考虑下面这个非常简单的Web表单:
很明显,第一个单选按钮具有默认的checked
属性,打开此Web表单会出现一个众所周知的图片:
在编写jQuery脚本文件时,我尝试通过检查单选按钮来检查 - 虽然可以使用prop()
以正确而不费力的方式完成,但我使用了attr()
。
使用浏览器的控制台,我可以立即查看结果:
但我知道在检查所需的一个之前应取消所有输入,以期望得到正确的结果:
争论从这里开始,当重新复制第一步时:
我的问题是为什么会发生这种情况?单选按钮中没有勾选标记,在服务器端也没有值。
admin 更改状态以发布 2023年5月22日
问题是与jQuery版本有关。这并不是一个漏洞,也没有随jQuery v3 alpha版本一起发布。\n\n然而,从jQuery v3 beta版本开始,removeAttr()
被稍微改变了一下。\n\n在jQuery <3.*中,removeAttr()
方法将动态/当前状态设置为false:\n\n
// Set corresponding property to false if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { elem[ propName ] = false;
\n\n而在另一方面,attr()
只设置默认状态(不是当前状态)。但在jQuery >= 3.0中,我们再也看不到这些行了。\n\n在除了v3.*(> 最终和beta版本)之外的所有版本中,我们不能期望这两行来检查收音机按钮:\n\n
$('input[name="type"]').removeAttr('checked'); $('input[value="3"]').attr('checked', true);
\n\n但是这三行可以同时使用:\n\n
$('input[name="type"]').removeAttr('checked'); $('input[value="3"]').attr('checked', true); $('input[value="3"]').prop('checked', true);
\n\n或者更简单:\n\n
$('input[name="type"]').removeAttr('checked'); $('input[value="3"]').prop('checked', true);
\n\n(但请注意,有些JavaScript代码可能检查属性而不是属性。因此,您必须进行额外的 .atrr()
)\n\n在早期版本中,最好根本不使用removeAttr()
,只使用attr()
,如下所示:\n\n
$('input[name="type"]:checked').attr('checked', false); $('input[type="3"]').attr('checked', true);
\n\nremoveAttr()
的这种行为变化也在Github上进行了讨论。\n\n感谢那些对此问题发表评论的人。