在顺序调用上的jQuery自动完成会在IE7独立版上引发JS错误

时间:2011-08-10 00:02:52

标签: jquery jquery-plugins internet-explorer-7 internet-explorer-6 jquery-autocomplete

我们有一个文本框,加上jQuery UI Autocomplete v1.8.14

除了IE7独立版中的特定场景外,它基本上运行良好且没有错误。假设用户正在输入一个字母,并且第一个AJAX请求因自动完成结果而消失。响应尚未返回,但用户输入另一个字母。此时,第一个请求将被中止为默认值,第二个请求将被启动以检索新搜索字符串的新结果。这是有意义的,因为备用带宽和丢失的执行时间,但不幸的是它在IE7上失败。

下图显示了在Firefox中使用Firebug会发生什么。基本上所有浏览器都能正常工作,除了IE7(甚至是IE6和IE8)。

Attached image showing the behavior in Firebug

有没有人见过这样的东西?最终是否有人知道是否可以强制自动完成器完成已启动的请求而不是中止它们?还有其他想法吗?

非常感谢,非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我有预感你只是使用source选项的字符串值并为其提供URL。如果正在进行AJAX请求,那么你正确地取消了它。来自小部件源代码的Check out this snippet

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);
        }
    });
}

(未经测试,但应该让你朝着正确的方向前进)

答案 1 :(得分:1)

我们最终解决了这个问题,将调用放入try-catch块并在IE7中触发时忽略错误。

这可能不是完美的方式,但中止请求的好处对其他浏览器仍然有效。