在Chrome中加载(readyState == 3)时XmlHttpRequest.responseText

Jar*_*vec 7 javascript ajax streaming google-chrome xmlhttprequest

我试图通过ajax(通过XmlHttpRequest(= xhr)在Javascript中"流式传输"(从服务器到客户端).我使用的是在"HTTP Streaming"(推送)AJAX模式的跨浏览器实现中描述的修改后的handleResponse函数

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;
}
Run Code Online (Sandbox Code Playgroud)

使用php脚本,它可以刷新数据(没有ajax,它会在进行时真正将数据刷新到浏览器)

我在Firefox中没有问题,但谷歌Chrome和IE给了我一个空的responseText而xhr.readyState等于3.我发现在互联网上描述了这个问题,但它没有给我任何解决方案.

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

如果你不知道,你知道某些产品的工作解决方案吗?(开源框架,图书馆等)

非常感谢你的想法.

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

And*_*rew 17

Chrome有一个错误,它只会在收到一定数量的字节后填充xhr.responseText.有两种方法可以解决这个问题,

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

要么

发送大约2kb的前奏来准备处理程序.

当readyState == 3时,这些方法中的任何一个都应该使chrome填充responseText字段.

IE7/8另一方面也做不到,你需要求助于长轮询或在IE8中使用XDomainRequest的跨域技巧,一个MS


Niv*_*vas 0

您提交请求的 URL - 它是您的域的一部分吗?

可能是因为同源政策

请参阅此问题以及规避它的可能方法(以及本文)。

  • 好吧,如果真是这样的话,他是不是也会面临FF的问题呢? (3认同)