带引号值的jQuery属性选择器不起作用

时间:2013-01-24 08:00:28

标签: javascript jquery jquery-selectors knockout.js

我有一个类名为.aa_ant的输入,其中包含值1

现在,当我正在加载页面时,我正在执行此操作(案例1):

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

按预期输出1

现在,我将其更改为(案例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");
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

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

这是jQuery实际上并不完全符合所宣传的CSS规范的情况。 [value*=1]无论如何工作的唯一原因是因为它不是一个有效的CSS选择器,所以在现代浏览器中它会跳过浏览器的原生Selectors API,而是使用jQuery的选择器引擎,它支持不带引号的数字可以基于value属性返回,即使value属性没有出现在标记中,因此您可以获得预期的结果。其他选择器[value*="1"][value*=a][value*="a"]都是有效的CSS,但与控件不匹配,因为它在标记中没有value属性,所以你没有结果。

如果你需要通过实际值查询输入控件,看看你是否可以通过其他东西来识别它(Knockout.js是否给它一个ID?),否则你必须做一些DOM traversal或{ {3}},并使用filtering检查其值以获取正确的元素。选择器应仅用于基于静态属性(即通常不会更改值的属性)进行查询,而不是用于value元素的input等动态属性。

使用.filter().val()的简短示例:

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

答案 1 :(得分:0)

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

如果您要查找输入值的长度,则需要执行以下操作:

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

以下是您的工作示例:http://jsfiddle.net/ptzVy/

以下是如何获取输入长度的示例:

http://jsfiddle.net/J52Yr/