Как избежать скобок с помощью li: textequals - PullRequest
3 голосов
/ 12 декабря 2011

ОБНОВЛЕНИЕ: добавлен код селектора textEquals.

Я использую jquery и автозаполнение для поля в моем веб-приложении.

У меня есть событие «change», которое гарантирует, что пользователь выбрал допустимое значение из списка автозаполнения. Это событие прекрасно работает, за исключением случаев, когда в выбранном значении есть скобки, а селектор 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 ]

3 голосов
/ 12 декабря 2011

В качестве альтернативы введению внешнего ввода в ваши селекторы jQuery, вы можете использовать each() метод для зацикливания <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('');
    }
}
3 голосов
/ 12 декабря 2011

Вот лучший :textEquals пользовательский селектор, не основанный на регулярном выражении, позволяющий вам использовать любые символы в скобках.

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

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

3 голосов
/ 12 декабря 2011

Я не проверял это, но документы jQuery предлагают две обратные косые черты:

Если вы хотите использовать любой из метасимволов (например, !"#$%&'()*+,./:;<=>?@[\]^{|}~) в качестве литеральной частиимя, вы должны экранировать символ с двумя обратными слешами: \.Например, если у вас есть элемент с id="foo.bar", вы можете использовать селектор $("#foo\\.bar").

Так что в вашем случае это может быть:

var val = $(this).val()
    .replace("(", "\\(")
    .replace(")", "\\)");
if ($(".ui-autocomplete li:textEquals('" + val + "')").size() == 0) {
    $(this).val('');
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...