我有一个非常简单的例子jsfiddle:
HTML:
<input type="text"/>
<input type="text" value="aaa"/>
JS:
$("input:first").val("aaa");
alert($("input[value='aaa']").length);
为什么Chrome和IE会返回不同的结果?为什么Chrome中的jQuery在使用jQuery设置时无法识别“价值”? 我怎么解决呢?我需要Chrome会返回与IE完全相同的结果。
编辑:我没有接受我的回答,因为在考虑了一点之后,我仍然不理解某些事情(也许我对几个部分的说法不对):
1)据我所知,浏览器在文本框中显示的文本应始终为“value”属性,因为如果我提交表单,则文本框和其他输入字段中显示的“值”将提交给服务器(如果他们没有被禁用)。
2)因此,如果文本框中显示的文本应存储在“值”中以便提交,那么如果$("input[type='text']").val("aaa")
将文本“aaa”分配给“value”属性,那对我来说很自然,因为它可能会在稍后提交。如果是这样,为什么$("input[value='aaa']")
没有拿起它?
3)其他一些东西......当我不使用jQuery的“val”方法,而是直接将文本输入到文本框中时,那么它不会转到“value”属性吗?我做了另一个例子,我不使用“val”将文本分配给文本框。我直接在文本框中输入,然后$("input[value='aaa']")
不再重新选择它。
这对我来说非常奇怪......我理解属性和属性之间的区别,但由于HTML表单的性质,我不明白为什么“val”没有赋值给属性,当直接输入时,它没有去“值”属性。
BTW :在http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/我发现了以下内容:
不应使用.attr()和.prop()来获取/设置值。 改为使用.val()方法(尽管使用.attr(“value”, “somevalue”)将继续工作,就像1.6)之前一样。
他们说“val”应该设置属性......或者我的英语不允许我理解它?
请解释我:)。
答案 0 :(得分:8)
我认为是因为.val
在input
上设置属性。然后使用[value="aaa"]
查看input
的属性,这些属性实际上没有改变。如果您更改使用jQuery
将输入值设置为:
$("input:first").attr("value", "aaa");
然后检查长度,你会得到你期望的结果。
小提琴:http://jsfiddle.net/gromer/ZnbpE/
属性和属性之间的区别: http://blog.jquery.com/2011/05/12/jquery-1-6-1-released
答案 1 :(得分:2)
由于问题很长,这个答案也会有点长: 第一件事:正如我用this小提琴所知,属性选择器输入[anyAttribute]的行为有点不一致:虽然input [value]只匹配实际属性,但input [maxlength]也匹配属性(测试了最近的FF,最近的Chrome,IE 9)。
要了解属性和属性之间的差异,请阅读: http://blog.jquery.com/2011/05/12/jquery-1-6-1-released
这意味着:要在输入内容后获取具有特定值的所有元素,通常不能使用输入[value ='nothing']。由于jQuery.val()也在钩子下使用.value属性,因此使用jQuery时也是如此。另一个fiddle来证明这一点。 (点击状态可用于在输入内容后获取信息。)
您提到的另一点是建议仅使用.val()来设置元素的值。这是完全正确的,因为它处理大多数错误和不同的实现。因此.attr('value')或.prop('value')可能会导致很少出现问题。
某些IE实际上匹配.value属性的输入[value ='aaa']可能是IE .querySelectorAll实现中的错误(或功能)或Sizzle的错误(或功能),jquery选择器引擎解决缺少的属性选择器。要检查一下,只需在你拥有的IE版本中运行the selector fiddle,如果你得到.querySelectorAll的一些例外,那就会引起问题,否则就是IE。 我没有安装旧版本的IE而不是9(因为Windows 7升级了IE的版本),所以如果有人可以检查它会很好。
最后一件事:如果您确实需要具有特定值的所有输入字段,请使用带有过滤功能的jQuery.filter来检查正确的.val