我正在尝试使用ajax(通过XmlHttpRequest(= xhr)在Javascript中“流式传输”(从服务器到客户端)。我正在使用修改后的handleResponse函数,
Cross-browser implementation of "HTTP Streaming" (push) AJAX pattern

function handleResponse() {
if (http.readyState != 4 && http.readyState != 3)
    return;
if (http.readyState == 3 && http.status != 200)
    return;
if (http.readyState == 4 && http.status != 200) {
    clearInterval(pollTimer);
    inProgress = false;
}
// In konqueror http.responseText is sometimes null here...
if (http.responseText === null)
    return;

while (prevDataLength != http.responseText.length) {
    if (http.readyState == 4  && prevDataLength == http.responseText.length)
        break;
    prevDataLength = http.responseText.length;
    var response = http.responseText.substring(nextLine);
    var lines = response.split('\n');
    nextLine = nextLine + response.lastIndexOf('\n') + 1;
    if (response[response.length-1] != '\n')
        lines.pop();

    for (var i = 0; i < lines.length; i++) {
        // ...
    }
}

if (http.readyState == 4 && prevDataLength == http.responseText.length)
    clearInterval(pollTimer);

inProgress = false;
}

使用php脚本,它可以刷新我的数据(没有ajax的话,它确实会在处理过程中将数据刷新到浏览器)

我在Firefox中没有问题,但是Google Chrome和IE给我一个空的responseText,而xhr.readyState等于3。我在Internet上发现了这个问题,但是并没有提供任何解决方案。

您知道如何在Chrome中解决此实现问题吗? (w3c说,在readyState == 3中,responseText不能为NULL-Chrome实现了此规则,但只给出了空字符串)

而且,如果您不知道,您是否知道某些产品中有任何可行的解决方案? (开源框架,librararies等)

非常感谢您的想法。

编辑:
解决方法是在创建iframe时,将脚本调用到iframe并在此处刷新数据,然后通过javascript从iframe抓取数据。但这不是ajax解决方案。我真的很想看到纯ajax解决方案。

最佳答案

Chrome浏览器存在一个错误,该错误仅在收到一定数量的字节后才填充xhr.responseText。有两种解决方法,

将返回的内容类型设置为“application / octet-stream”

要么

发送大约2kb的前奏以准备处理程序。

当readyState == 3时,这两种方法都应使chrome填充responseText字段。

IE7 / 8则无法做到这一点,您需要求助于长时间轮询或将跨域技巧与IE8中的XDomainRequest一起使用,这是一个MS

07-28 01:06
查看更多