Автозаполнение jQuery при последовательном вызове вызывает ошибку JS в автономном IE7 - PullRequest
1 голос
/ 10 августа 2011

У нас есть текстовое поле в сочетании с jQuery UI Autocomplete v1.8.14

В принципе, оно прекрасно работает и без ошибок, за исключением определенного сценария в IE7 автономно.Предположим, что пользователь вводит букву, и первый запрос AJAX отправляется для результатов автозаполнения.Ответ еще не вернулся, но пользователь вводит еще одну букву.В этот момент первый запрос прерывается по умолчанию, и запускается второй, чтобы получить новые результаты для новой строки поиска.Это имеет смысл, поскольку позволяет сэкономить пропускную способность и потерять время выполнения, но, к сожалению, это не работает в IE7.

На следующем рисунке показано, что происходит с использованием Firebug в Firefox.По сути, все браузеры работают правильно, кроме IE7 (даже IE6 и IE8).

Attached image showing the behavior in Firebug

Кто-нибудь когда-нибудь видел что-то подобное?Знает ли кто-нибудь в конце концов, можно ли заставить автозаполнитель завершать запущенные запросы, а не прерывать их?Любые другие идеи?

Большое спасибо, любая помощь высоко ценится!

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Мы наконец решили проблему, поместив вызов в блок try-catch и проигнорировав ошибку, если сработал в IE7.

Вероятно, это не идеальный способ сделать это, но преимущества прерывания запросаостаются в силе для остальных браузеров.

1 голос
/ 10 августа 2011

У меня есть догадка, что вы просто используете строковое значение для опции source и предоставляете ему URL.Вы правы относительно того, что виджет прерывает запросы AJAX, если он выполняется. Проверьте этот фрагмент из исходного кода виджета:

url = this.options.source;
this.source = function(request, response) {
    if (self.xhr) {
        self.xhr.abort(); // <-- Problematic line.
    }
    self.xhr = $.ajax({
        url: url,
        data: request,
        dataType: "json",
        autocompleteRequest: ++requestIndex,
        success: function(data, status) {
            if (this.autocompleteRequest === requestIndex) {
                response(data);
            }
        },
        error: function() {
            if (this.autocompleteRequest === requestIndex) {
                response([]);
            }
        }
    });
}

Если вы передаете строку в параметр source, вы можете легко заменить ее функцией, выполняющей AJAX.вызовите вручную (и чтобы вы не прерывали запрос):

source: function (request, response) {
    $.ajax({
        url: "your_url",
        data: request.term,
        dataType: "json",
        success: function(data, status) {
            response(data);
        }
    });
}

(не проверено, но должно направить вас в нужном направлении)

...