【问题标题】:jQuery "by attribute" selectorjQuery“按属性”选择器
【发布时间】:2012-10-02 16:39:26
【问题描述】:

我有一个很简单的例子jsfiddle:

HTML:

<input type="text"/>
<input type="text" value="aaa"/>

JS:

$("input:first").val("aaa");
alert($("input[value='aaa']").length);​

为什么 Chrome 和 IE 会返回不同的结果?为什么使用 jQuery 设置时,Chrome 中的 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”不将值分配给属性,并且在直接输入时,它不会转到“价值”属性。

Updated jsfiddle

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

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

他们说“val”应该设置属性...或者我的英语让我看不懂对吗?

请解释一下:)

【问题讨论】:

  • 嗯,值得看看属性和属性的区别(blog.jquery.com/2011/05/12/jquery-1-6-1-released),选择器可能只搜索属性(在chrome中),而jQuery选择器引擎(Sizzle)可能会接受价值也是...
  • @DerWaldschrat 将此作为答案。了解属性和属性之间的区别很重要。
  • 好的,当我完成 jsFiddle 后,我将为所有这些创建一个完整的答案,但仅使用 .val() 访问该值绝对是正确的。
  • @DerWaldschrat 谢谢,会等待它:)

标签: javascript jquery jquery-selectors


【解决方案1】:

认为这是因为.valinput 上设置了属性。然后使用[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

【讨论】:

  • 好的,这解释了一些事情,但问题是为什么 Internet Explorer 将“属性”识别为“属性”?为什么 jQuery 在浏览器中的行为不同?不应该是“跨浏览器”改编的吗?
  • 也许这是一个嘶嘶作响的错误,因为 Internet Explorer 不支持属性选择器,或者他支持它们具有与属性匹配的不同行为......
  • @DerWaldschrat 我更新了我的问题,因为我仍然不清楚。可以的话请解释一下。
【解决方案2】:

由于问题很长,所以这个答案也会更长一点: 第一件事:正如我用this fiddle 发现的那样,属性选择器 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 时也是如此。另一个fiddle 来证明这一点。 (输入内容后,点击状态可用于获取信息)。

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

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

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

【讨论】:

  • 感谢您的详细回答。它显示了价值检索的可能变化。但有一件事我还不清楚。当我在文本框中输入值时,DOM原生“属性值”中不存在文本(getAttribute无法检索它),那么浏览器在回发后如何将值传输到服务器,如果getAttribute没有返回实际值?
  • 嗯,它存储在dom属性值中,这些是发送到服务器的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2013-03-08
  • 2023-03-04
  • 2010-10-19
  • 1970-01-01
  • 2011-03-04
相关资源
最近更新 更多