4

我有一个非常简单的例子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)据我所知,浏览器在文本框中显示的文本应始终在“值”属性中,因为如果我提交表单,则文本框和其他输入字段中显示的“值”将提交给服务器(如果不是禁用)。

2)因此,如果文本框中显示的文本应该存储在“value”中以便提交,那么$("input[type='text']").val("aaa")将文本“aaa”分配给“value”属性对我来说很自然,因为它可能会在以后提交。如果是这样,为什么$("input[value='aaa']")不把它捡起来?

3)其他一些事情......当我不使用jQuery的“val”方法,而是直接将文本输入到文本框时,它不会转到“value”属性吗?我做了另一个例子,我不使用“val”将文本分配给文本框。我直接在文本框中输入它,然后$("input[value='aaa']")不再拿起它。

这对我来说非常奇怪......我理解属性和属性之间的区别,但由于 HTML 表单的性质,我不明白为什么“val”不将值分配给属性,直接输入时,它不会给“价值”属性。

更新了 jsfiddle

顺便说一句:在http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/我发现以下内容:

.attr() 和 .prop() 都不应该用于获取/设置值。改用 .val() 方法(尽管使用 .attr(“value”, “somevalue”) 将继续工作,就像它在 1.6 之前所做的那样)。

他们说“val”应该设置属性......或者我的英语不允许我理解它吗?

请解释我:)

4

2 回答 2

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

于 2012-10-02T16:46:17.217 回答
2

由于问题很长,所以这个答案也会更长一点:第一件事:正如我用这个小提琴弄明白的那样,属性选择器 input[anyAttribute] 的行为有点不一致:而 input[value] 只匹配真实属性,input[maxlength] 也匹配属性(在最近的 FF、最近的 Chrome、IE 9 中测试)。

要了解属性和属性之间的区别,请阅读: http ://blog.jquery.com/2011/05/12/jquery-1-6-1-released

这意味着:要在输入内容后获取具有特定值的所有元素,通常不能使用 input[value='anything']。由于 jQuery.val() 也使用了 hook 下的 .value 属性,所以在使用 jQuery 时也是如此。另一个小提琴来证明这一点。(输入某些内容后,单击状态可用于获取信息)。

您提到的另一点是建议仅使用 .val() 来设置元素的值。这是完全正确的,因为它处理了最多的错误和不同的实现。所以 .attr('value') 或 .prop('value') 可能会在极少数情况下导致一些问题。

某些 IE 实际上匹配 .value 属性的 input[value='aaa'] 可能是 IE .querySelectorAll 实现中的错误(或功能)或 Sizzle 的错误(或功能),用于解决问题的 jquery 选择器引擎缺少属性选择器。要检查这一点,只需在您拥有的 IE 版本中运行选择器小提琴,如果您在 .querySelectorAll 中遇到一些异常,则它是导致问题的嘶嘶声,否则是 IE。我没有安装比 9 更旧的 IE 版本(因为 Windows 7 升级了 IE 的版本),所以如果有人能检查一下就好了。

最后一件事:如果您确实需要所有具有特定值的输入字段,请使用带有过滤功能的jQuery.filter来检查正确的 .val

于 2012-10-03T11:16:39.530 回答