2013-01-24 34 views
0

我有一个类名称为.aa_ant包含值1输入。jQuery属性选择器与价值左右价值不起作用

现在,当我加载页面我在做这个(案例1):

alert($('.aa_ant[value*=1]').length) 

它输出1预期。现在

,我将其更改为(CASE 2):

alert($('.aa_ant[value*="1"]').length) 

它停止工作。另外,如果我将1更改为a,它也会停止工作(情况1和2)。

我做错了什么?

更新:的.aa_ant是淘汰赛控制:

 
<input class='aa_ant' data-bind='value: aa_ant, readOnly: is_readonly' /> 

莫非有问题?

更新:使用length属性我想查看是否有任何包含该值的输入元素(我不希望任何元素具有该值)。此外,我知道我可以获取所有.aa_ant元素并通过它们枚举来查看是否有人包含该值,但我想要做到这一点jquery-ish。

更新: 下面是引用实际的解决方案:为帮助

 
if($('.aa_ant').filter(function(index) { 
    if(this.value.indexOf("1") >=0) { 
     return true ; 
    } 
    return false ; 
}).length>0) { 
    alert("Error"); 
} 

谢谢!

+7

两个工作对我蛮好:http://jsfiddle.net/zzR2w/ – Blender

+2

如果你改变了'1'到_what_? – nnnnnn

回答

4

您的控件不会出现有value属性。 CSS属性选择器如果没有在标记中设置,将无法读取元素的属性,这就是它失败的原因。

这是一个jQuery实际上并未完全符合CSS规范的广告。 [value*=1]的工作原因无关,因为它不是一个有效的CSS选择器,所以在现代浏览器中,它跳过浏览器的本机选择器API,并使用jQuery的选择器引擎,它支持非引号数字可以基于value属性返回,即使value属性没有出现在标记中,所以您会得到预期的结果。其他选择器[value*="1"],[value*=a][value*="a"]都是有效的CSS,但与您的控件不匹配,因为它在标记中没有value属性,所以不会得到任何结果。

如果你需要它的实际价值来查询的输入控制,看看你能不能用别的东西识别它(不Knockout.js给它一个ID?),否则你必须做一些DOM traversalfiltering,并使用.val()检查其值,以获得正确的元素。选择器只能用于基于静态属性(即通常不会改变值的属性)的查询,而不适用于像valueinput等元素的动态查询。

一个简单的例子使用.filter().val()

$('.aa_ant').filter(function() { return $(this).val().indexOf('1') >= 0; }); 
+0

那么我该怎么做? – Serafeim

+2

@Serafeim你可以使用'filter'方法。 – undefined

+0

是的!过滤器正在工作:) – Serafeim

0

你想用.length属性实现什么? .length将返回页面上匹配选择器的数量。

如果你想找到输入的值的长度,你需要做到以下几点:

alert($('.aa_ant[value*="1"]').val().length) 

这里的工作你的例子:http://jsfiddle.net/ptzVy/

,这里是如何让一个例子输入长度:

http://jsfiddle.net/J52Yr/

+1

使用length属性我想查看是否有任何包含该值的输入元素(我不希望任何元素具有该值) – Serafeim