JQuery使用空属性选择器返回非空输入

时间:2011-07-29 00:35:03

标签: jquery jquery-selectors attributes

在使用JQuery提交错误之前将此发布在此处进行讨论。

考虑这个小提琴:

http://jsfiddle.net/tWPS6/2/

我在HTML中设置一个输入的value属性,另一个使用Javascript。然后我请求JQuery选择空输入(输入值为==“”)。它返回1的长度(其中的一个输入是#input2)。

就好像这个空属性选择器基于原始HTML中的输入标记的原始值而不是当前值进行选择,即使任何其他方法检查value属性(如.value或.val) ())会告诉我它实际上并不是空的。

这似乎是JQuery中的一个错误。正确的吗?

2 个答案:

答案 0 :(得分:4)

首先是:

这不是jQuery中的错误。

元素之间存在显着差异 的属性:

var attr = element.getAttribute('foo');

和元素属性:

var prop = element.foo;

This answer非常好地解决了 - 短版本是属性与属性混乱,浏览器并不总是正确,但是you almost always want to use the property, not the attribute when working with the DOM

  

忘记属性。你几乎总是想要一个属性,而不是一个属性。如果属性和具有相同名称的属性都存在,则属性始终表示当前状态,而属性(在大多数浏览器中)表示初始状态。这会影响属性,例如<input>元素的值属性。


如果您现在了解属性群集!@#$,您应该希望看到它的发展方向。

选择器'input[value=""]'属性选择器。这意味着它不是属性选择器。在您的示例的两个回合中,$('input[value=""]')仅匹配<input id="input2" value=""/>,因为该元素(并且只有该元素)是:

  • 具有value属性和
  • value属性等于空字符串。

.val()设置<input>元素的value属性,而不是value属性。顾名思义,属性选择器匹配元素的属性,因此当属性没有改变时,它不会选择任何不同的东西。

此外,jQuery还会做各种各样的精彩内容:

  • 提供跨浏览器的一致行为,
  • 提供与文档一致的行为,
  • 特别是.attr()(有quite the checkered past)可能非常难看。

哦,最后一个链接:John Resig on jQuery 1.6 and .attr()阅读。

答案 1 :(得分:0)

试着试一试:

var emptyInputsRound1 = $('input[value=""]');
$('#input2').attr("value",'hi2'); //notice change
var emptyInputsRound2 = $('input[value=""]');
$('#output').text(emptyInputsRound1.length + ', ' + emptyInputsRound2.length);

工作示例:http://jsfiddle.net/fSaQh/