jquery-ui автозаполнение спорадического поведения

Ниже приведен код моего автозаполнения. Проблема в том, что это в основном работает. Скажем, у меня есть куча результатов, таких как test1, test2, test3 и т. д. Если я наберу «t», они всплывут, когда я поставлю e в «te», они исчезнут. Затем, если я вставлю «s», это еще больше сузит круг. это не всегда вторая буква. Это только кажется спорадическим. Пожалуйста помоги. Я подтвердил, что возвращаемые данные надежны, так что на сервере ничего нет.

        //Server autocomplete
        $("#txtSearchServer").keyup(function (event) {
            $.ajax({
                url: 'edit/EditService.svc/SearchServers',
                type: 'GET',
                data: { 'term': $("#txtSearchServer").val() },
                dataType: 'json',
                success: function (data) {
                    var listServers = [];
                    $.map(data.d, function (item) {
                        ///working here to do server autocomplete!!!!!!!
                        listServers.push(item.ServerName);
                        $("#txtSearchServer").autocomplete({
                            source: listServers
                        });
                    });
                },
                error: function (a, b, c) {
                    $('.Toast').html('Error Retreiving Servers for autocomplete!');
                }
            });
        });

person JOATMON    schedule 11.08.2011    source источник
comment
почему вы запускаете автозаполнение каждый раз, когда ajax завершается успешно, поверх события keyup? автозаполнение должно быть инициировано один раз для того, к чему вы его применяете.   -  person GnrlBzik    schedule 12.08.2011
comment
Таким образом, он динамический в зависимости от того, что вы вводите. Каждый раз, когда вы вводите букву, он запрашивает у веб-службы полное значение в текстовом поле и возвращает 10 первых совпадающих имен.   -  person JOATMON    schedule 12.08.2011
comment
(обратите внимание, я никогда раньше не использовал автозаполнение jquery-ui...)   -  person JOATMON    schedule 12.08.2011
comment
Итак, если я инициирую автозаполнение вне запроса ajax и укажу источник как listServers, все, что мне нужно сделать, это обновить эту переменную, и она автоматически обновит результаты?   -  person JOATMON    schedule 12.08.2011
comment
я имею в виду, что у вас должен быть источник: listServers, listServers, определенный вне автозаполнения и вызова ajax, и обновлять его при каждом успешном вызове ajax. По сути, у вас есть автозаполнение, применяющее свои события к вашему полю ввода, и вы применяете свое событие keyup и все время перезаписываете эту переменную, создавая новые экземпляры автозаполнения после каждого нажатия клавиши.   -  person GnrlBzik    schedule 12.08.2011


Ответы (2)


Глядя на свой код, вы делаете asp.net

ТАК это должно работать для вас:

function AutocompleteJSONParse(data) {
    var rows = new Array();
    var rowData = null;
    for (var i = 0, dataLength = data.length; i < dataLength; i++) {
        rowData = data[i];
        rows[i] = {
            value: rowData.ServerName,
            label: rowData.ServerName
        };
    }
    return rows;
};
$("#txtSearchServer").autocomplete({
    source: function(request, response) {
        var pString = '{"term":"' + request.term + '"}';
        $.ajax({
            url: 'edit/EditService.svc/SearchServers',
            type: 'GET',
            dataType: "jsond",
            type: "POST",
            contentType: "application/json",
            converters: {
                "json jsond": function(msg) {
                    return msg.hasOwnProperty('d') ? msg.d : msg;
                }
            },
            data: pString,
            success: function(data) {
                var rows = AutocompleteJSONParse(data);
                response(rows);
            }
        });
    },
    error: function(a, b, c) {
        $('.Toast').html('Error Retreiving Servers for autocomplete!');
    },
    minLength: 2,
    delay: 1000
});
person Mark Schultheiss    schedule 11.08.2011
comment
Я не тестировал этот код точно, но после исследования это основной вывод, к которому я пришел. Вызов ajax должен быть внутри источника автозаполнения, и это то, что я сделал, и это работает. Спасибо! - person JOATMON; 12.08.2011
comment
Одним из ключевых элементов вашего asp.net является конвертер. Это обратно совместимо с более старыми версиями asp.net, а также с более новыми, так что (data.d), который у вас есть, просто преобразуется - он обнаруживает присутствие и делает его согласованным. Я использовал синтаксический анализ, а не .map, так как это дает мне возможность использовать очень сложный объект json на исходном конце и сопоставлять несколько значений, например, для других целей. Однако он не кэширует потенциальные данные, поскольку я использовал это почти со 100 000 значений в моем источнике данных с совпадением нескольких терминов, поэтому вы можете сделать это. - person Mark Schultheiss; 12.08.2011

Вот ответ: https://gist.github.com/1140631, который должен решить эту проблему.

РЕДАКТИРОВАТЬ: мне также было интересно, почему вы динамически выполняете предварительную выборку результатов, не можете ли вы сразу получить полный список? Или это слишком много данных?

person GnrlBzik    schedule 11.08.2011
comment
Хорошо, я точно вставил этот код, и при каждом нажатии он выполняет запрос, который возвращается в порядке, но я никогда не получаю всплывающее окно автозаполнения. - person JOATMON; 12.08.2011
comment
можете ли вы настроить свой код на jsfiddle.net, пожалуйста, и опубликуйте ссылку на него, как только закончите. - person GnrlBzik; 12.08.2011
comment
также взгляните на этот пост, в нем объясняется, как динамически изменить источник плагина автозаполнения. stackoverflow .com/questions/3399139/ Я также обновил свой исходный код, чтобы отразить это. - person GnrlBzik; 12.08.2011