jQuery 选择器 [name=value] 不起作用

Posted

技术标签:

【中文标题】jQuery 选择器 [name=value] 不起作用【英文标题】:jQuery Selector [name=value] doesn't work 【发布时间】:2012-04-27 10:29:35 【问题描述】:

我是 jQuery 的新手。我在使用 [name=value] 选择器时遇到了问题。 这是 html

<input type="number"/>

很简单,对吧? 这是JS:

$("input").val(100);
$("input[value='100']").val(200)​

结果是:脚本的第一行有效,但第二行无效。(Chrome, FF, IE9) 两条线都在 IE8 中工作。 这是怎么发生的?顺便说一句,我正在使用 jQuery1.7.2。或者你可以在http://jsfiddle.net/wzKNV/上测试上面的代码

【问题讨论】:

又快又脏,这是我会使用的方法。 val() 是属性而不是属性,这意味着属性选择器在这种情况下不起作用。我创建了一个 jsfiddle,并克隆了元素以向您展示分离。 jsfiddle.net/7PZdt 【参考方案1】:

如果

<input type="nubmer" disabled="disabled" value="100" />​ // your fiddle have no `value`

然后

$("input[value='100']").val(200)​​​​​​​

会起作用

【讨论】:

【参考方案2】:

attribute-equals 选择器检查 attribute,但 .val() 仅更改属性,因此选择器看不到更新。

jQuery/Sizzle 默认使用的原生 querySelectorAll 方法强制执行这种“仅属性”行为。

如果你破坏了querySelectorAll 的选择器,所以必须使用 Sizzle,它会起作用...

// v------made it a non-standard Sizzle selector
$(":input[value='100']").val(200);

这是因为 Sizzle 选择器不一定符合 qSA 选择器。当然,这会稍微改变选择器的含义,但对说明很有用。

演示: http://jsfiddle.net/wzKNV/3/


要使用标准选择器(这是 IMO 的一个好主意),您可以使用 filter() 代替...

$("input").filter(function()  return this.value === '100'; )
          .val(200);

演示: http://jsfiddle.net/wzKNV/4/

【讨论】:

嗯,真的教会了我很多关于 jQuery 和 qSA 选择器的知识。 奇怪为什么原始代码中的两行都可以在 IE8 中工作,因为它还实现了 Selectors API。该浏览器中可能还发生了其他事情。 @BoltClock'saUnicorn:似乎在 IE8 中向元素 (或修改一个) 添加属性也会修改属性。 jsfiddle.net/9bCCR 甚至自定义属性也使用getAttribute 出现。 IE9 似乎运行正常。 这个答案解决了$("input:hidden[value=true]").length 的问题。将 IE 更改为 $("input:hidden").filter(function() return this.value === "true"; ).length

以上是关于jQuery 选择器 [name=value] 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Jquery基本选择器总结

jquery (1.8.2) 数据选择器

jquery 选择器加变量

Jquery 选择器按其值获取下拉列表

jquery属性选择器

名称属性中带有方括号的输入的 jQuery 选择器