如何用li:textequals转义括号

时间:2011-12-12 18:26:29

标签: jquery autocomplete

更新:添加了textEquals选择器代码。

我正在为我的网络应用程序中的字段使用jquery和autocomplete。

我有一个“更改”事件,可确保用户从自动填充列表中选择有效值。此事件很有效,除非所选值中有括号,li:textequals选择器不起作用。

如何使用li:textequals翻译我正在寻找的文本中的括号?

    change: function (event, ui) {
        //if the value of the textbox does not match a suggestion, clear its value             
        if ($(".ui-autocomplete li:textEquals('" + $(this).val() + "')").size() == 0) {
            $(this).val('');
        };

textEquals选择器代码:

$.expr[':'].textEquals = function (a, i, m) {
    return $(a).text().match("^" + m[3] + "$"); 
};

3 个答案:

答案 0 :(得分:3)

我没有对此进行过测试,但jQuery文档建议使用两个反斜杠:

  

如果您希望使用任何元字符(例如!"#$%&'()*+,./:;<=>?@[\]^{|}~)作为名称的文字部分,则必须使用两个反斜杠转义字符:\。例如,如果您的元素为id="foo.bar",则可以使用选择器$("#foo\\.bar")

所以在你的情况下可能需要:

var val = $(this).val()
    .replace("(", "\\(")
    .replace(")", "\\)");
if ($(".ui-autocomplete li:textEquals('" + val + "')").size() == 0) {
    $(this).val('');
};

答案 1 :(得分:3)

作为将外部输入注入jQuery选择器的替代方法,您可以使用each() method循环<li>项,直到找到匹配项:

change: function (event, ui) {
    var referenceValue = $(this).val();
    var matches = false;

    $(".ui-autocomplete li").each(function(){
        if( $(this).text()==referenceValue ){
            matches = true;
            return false;
        }
    });

    if(!matches){
        $(this).val('');
    }
}

答案 2 :(得分:3)

这是一个更好的:textEquals自定义选择器,它不依赖于正则表达式,允许您在括号内使用所需的任何字符。

$.expr[':'].textEquals = function(a, i, m) {
    return $(a).text() === m[3];
};
alert($("div:textEquals('foo(bar)')").length);

http://jsfiddle.net/Tentonaxe/77TVF/