JQuery UI Автозаполнение странное поведение - PullRequest
2 голосов
/ 23 апреля 2011

Я недавно начал использовать jQuery-ui-autocomplete. Однако я сталкиваюсь со странным и утомленным поведением. Я пытаюсь использовать автозаполнение для многозначных удаленных данных (данных из моей службы данных). Мой код для извлечения последнего термина после запятой не работает. Мой код как:

function split(val) {
    return val.split(/,\s*/);
}

function extractLast(term) {
    return split(term).pop();
}

Код для автозаполнения

$('#txtBox')
    .bind("keydown", function (event) {
        if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) {
            event.preventDefault();
        }
    })    
    .autocomplete({
        minLength: 3,
        selectFirst: true,
        source: function (request, response) {
            $.ajax('My/Data/Source.json', {
                global: false,
                success: function (data) {
                    response($.map(data.d.results, function (item) {
                        return {
                            label: item.Name,
                            id: item.id
                        }
                    }));
                }
            });
        },
        search: function () {
            // custom minLength
            var term = extractLast(this.value);
            if (term.length < 3) {
                return false;
            }
        },
        focus: function () {
            // prevent value inserted on focus
            return false;
        },
        select: function (event, ui) {
            var terms = split(this.value);
            // remove the current input
            terms.pop();
            // add the selected item
            terms.push(ui.item.value);
            // add placeholder to get the comma-and-space at the end
            //terms.push("");
            this.value = terms.join(", ");
            return false;
        }
    });

Когда я помещаю отладчик в функцию «поиск», термин всегда больше 3. Это означает, что он не правильно оценивает регулярное выражение. Когда я включаю термин

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

работает отлично. Но я не могу включить это в мои страницы. Однако в Firefox это работает правильно без объявления doctype. Я пробовал это в IE8 и IE9, но безуспешно. <Ч /> UPDATE Пройдя немного дальше, обнаружил, что основная проблема заключается в том, как IE и другие браузеры пытаются разделить последний член с помощью регулярного выражения. С IE, когда во второй раз он пытался разделить термины после, (запятая). Например, http://jsfiddle.net/mE6th/ попробуйте открыть эту ссылку в Chrome и IE и увидеть разницу.

1 Ответ

1 голос
/ 23 апреля 2011

Если вы хотите, чтобы последний член в строке через запятую не мог просто использовать это .split(',').pop(), например:

'java,c++,php'.split(',').pop();

дает "php"

...