3
for (var i = 0; i < 5; ++i) {
  var xhr;
  if (window.XMLHttpRequest) {
    xhr = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    xhr = new ActiveXObject("Msxml2.XMLHTTP");
  }
  xhr.open('GET', '/Test/LongOperation?p=' + new Date());
  xhr.send('');
}

这只是一个演示(不是实时代码),但它说明了核心问题。 LongOperation是一种在 10 秒后返回结果的方法。

问题:

  1. 为什么在执行上述代码片段后,当用户试图离开页面时,IE8(可能还有其他 IE)会挂起?FireFox/Safari 取消这些请求并允许导航到另一个页面。如果替换'i < 5'为,'i < 4'则 IE 将不会挂起。

  2. 如何解决这种丑陋的 IE 行为?当他们的浏览器突然挂起时,用户非常沮丧。

4

3 回答 3

3

大多数浏览器对任何给定服务器的连接限制为 4 个。解决此“问题”的一种方法可能是对带外 XML 请求使用不同的主机名 - 您的用户请求将发送到主主机,而 AJAX 请求可以发送到第二个服务器。

于 2009-05-14T08:25:50.087 回答
2

我对我的问题的回答。我中止了 window.onbeforeunload 中所有未完成的 xhr 对象。至少这个解决方案对我有用。我稍微覆盖了 $.ajax() 方法的行为:

;(function($) {
    var rq = [];
    var ajax = $.ajax;
    $.ajax = function(settings) {
        // override complete() operation
        var complete = settings.complete;
        settings.complete = function(xhr) {
            if (xhr) {
                // xhr may be undefined, for example when downloading JavaScript
                for (var i = 0, len = rq.length; i < len; ++i) {
                    if (rq[i] == xhr) {
                        // drop completed xhr from list
                        rq.splice(i, 1);
                        break;
                    }
                }
            }
            // execute base
            if (complete) {
                complete.apply(this, arguments)
            }
        }

        var r = ajax.apply(this, arguments);
        if (r) {
            // r may be undefined, for example when downloading JavaScript
            rq.push(r);
        }
        return r;
    };

    // 'kill' all pending xhrs
    $(window).bind('beforeunload', function() {
        $.each(rq, function(i, xhr) {
            try {
                xhr.abort();
            } catch(e) {
                $debug.fail('failed to abort xhr');
            }
        });
        rq = [];
    });
})(jQuery);

$debug - 我的实用程序类

于 2009-05-15T15:37:37.047 回答
0

尝试异步运行它们,然后在每个完成时触发下一个 http 请求。我怀疑 xmlhttp 请求阻塞了 IE 的 UI 线程,而在其他浏览器上的实现更优雅一些。

希望这将为您提供问题 2 的解决方法,但我只能猜测问题 1 的真正原因,它可能只是一个错误。

于 2009-05-14T08:30:14.117 回答