Уничтожение / создание автозаполнения jquery - PullRequest
0 голосов
/ 20 октября 2011

Нет ли способа отменить ajax-вызов автозаполнения jQuery, когда ввод теряет фокус? Я пришел к выводу, что мне нужно а) уничтожить автозаполнение (и удалить класс 'ui-autocomplete-loading') на размытие и б) создать автозаполнение на фокусе. Мой код, который отлично работает, чтобы сделать это:

            $('#myinput').focus(function(){
                $('#myinput').autocomplete({
                    delay: 250,
                    source: function(request, response) {
                        $.ajax({
                            url: "cfc/myfunctions.cfc?method=lookup&returnformat=json",
                            dataType: "json",
                            data: {
                              search: request.term,
                              maxRows: 20
                            },
                            success: function(data) {
                              response(data);
                            }                   
                        })
                    },
                    change: function(event, ui) {     
                        if (!ui.item) {
                            $(this).val('');
                        }
                    }
                });
            });

            // necessary to cancel autocompletes if the user leaves the input or closes the filter
            $('#myinput').blur(function(){
                $(this).removeClass('ui-autocomplete-loading').autocomplete('destroy');
            });

Это имеет ожидаемое поведение отмены автозаполнения (и удаления значка loading.gif) при размытии и включения автозаполнения, когда ввод получает фокус.

Что странно, когда пользователь делает это, пока автозаполнение занимает много времени, чтобы ответить. В этом случае у меня есть автозаполнение, которое иногда занимает 20 секунд, чтобы ответить (да, я знаю, это другая проблема). Если пользователь вводит значение, щелкает где-то еще и возвращается к повторному удару при автозаполнении, выполняется новый вызов, отображается значок новой загрузки, а первый вызов ajax все еще работает в фоновом режиме. Когда первый вызов ajax завершается, даже если этот экземпляр автозаполнения был уничтожен, обратный вызов удаляет класс 'ui-autocomplete-loading' экземпляра CURRENT, и значок исчезает, даже если текущее автозаполнение все еще остается позади сцены.

Нет ли другого способа отменить автозаполнение или, что еще лучше, отменить базовый вызов ajax?

1 Ответ

0 голосов
/ 18 октября 2012

Используйте отключение, не разрушайте его

Если вы хотите, чтобы пользователь снова использовал ввод, просто отключите его при размытии.

Вы также можете установить тайм-аут, чтобы jQuery «убивал» другие запросы:

             $('#myinput').autocomplete({
                delay: 250,
                source: function(request, response) {
                    $.ajax({
                        url: "cfc/myfunctions.cfc?method=lookup&returnformat=json",
                        dataType: "json",
                        timeout: 5000 //<--- wait five seconds before giving up
                        data: {
                          search: request.term,
                          maxRows: 20
                        },
                        success: function(data) {
                          response(data);
                        }                   
                    })
                },
                change: function(event, ui) {     
                    if (!ui.item) {
                        $(this).val('');
                    }
                }
            });
...