2012-10-02 145 views
3

我有一个非常简单的例子jsfiddlejQuery的 “按属性” 选择

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)一些其他的事情....当我不使用“val”方法的jQuery,而是直接输入文本到文本框,然后它不会去“值”属性?我做了另一个例子,我不使用“val”将文本分配给文本框。我直接在文本框中输入它,然后$("input[value='aaa']")不再提取它。

对我来说这非常奇怪......我明白属性和属性之间的区别,但是由于HTML表单的本质,我不明白为什么“val”不会将值赋值给属性,并且直接输入,它不会去“值”属性。

Updated jsfiddle

BTW:在http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/我发现如下:

既不.attr()也不.prop()应被用于获取/设定值。 改为使用.val()方法(虽然使用.attr(“value”, “somevalue”)将继续工作,就像1.6之前一样)。

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

请给我解释一下:)

+1

嗯,这是值得看的属性和特性之间的区别( http://blog.jquery.com/2011/05/12/jquery-1-6-1-released/),而选择器可能只搜索属性(以chrome),而jQuery选择器引擎(Sizzle)可能接受价值以及... – DerWaldschrat

+0

@DerWaldschrat这是一个答案。属性和属性之间的区别很重要。 – Prinzhorn

+0

好的,当我完成jsFiddle时,我将为此创建一个完整的答案,但仅使用.val()来访问该值绝对是正确的。 – DerWaldschrat

回答

7

认为这是因为.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

+0

好的,这解释了一些事情,但然后问题为什么Internet Explorer确认“属性”为“属性”?为什么jQuery在浏览器中表现不同?它不应该是“跨浏览器”改编的吗? –

+1

也许这是一个嘶嘶作响的bug,因为Internet Explorer不支持属性选择器,或者他用不同的行为匹配属性来支持它们... – DerWaldschrat

+0

@DWWaldschrat我更新了我的问题,因为事情仍然不清楚。请解释你是否可以。 –

2

由于问题很长,这个答案也将是一个长一点: 的第一件事:当我想通了与this小提琴,属性选择器输入[anyAttribute]的行为是不一致的:虽然input [value]只与实际属性匹配,但输入[maxlength]也匹配属性(在最近的FF,最近的Chrome,IE 9中测试过)。

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

这意味着:要获得的东西之后的特定值的所有元素被输入了,你平时不能使用输入[值='什么“]。由于jQuery.val()也使用钩子下的.value属性,所以在使用jQuery时也是如此。另一个fiddle来证明这一点。 (点击状态可用于在输入内容后获取信息)。

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

某些IE实际上匹配.value属性的input [value ='aaa']可能是IE .querySelectorAll实现中的错误(或功能)或Sizzle的错误(或功能),jquery选择器引擎来解决缺少的属性选择器。要检查,只需在您拥有的IE版本中运行the selector fiddle,并且如果您使用.querySelectorAll出现一些异常,则会导致问题,否则会出现问题。 我没有安装过9以上版本的IE浏览器(自Windows 7升级IE版本以来),所以如果有人能够检查这个版本会很好。

最后一件事:如果你真的需要它有一个特定值的输入字段,使用jQuery.filter具有过滤功能来检查正确.VAL

+0

谢谢你的详细答案。它显示了价值检索的可能变化。但有一点仍然不清楚。当我在文本框中输入值时,文本不存在于DOM本地“属性值”(getAttribute无法检索它),那么在回发后浏览器如何将值传递给服务器,如果getAttribute不返回实际值? –

+0

好吧,它存储在dom属性值中,这些是发送到服务器的... – DerWaldschrat