不,Chrome、Safari、FireFox 不正常。因为在事件 readystate.LOADED 上,它可以在客户端处理来自服务器的数据
/**
* @param {string} url
* @param {function(*)} callback
* @param {boolean} reload */
archiva.io.streamXhr = function(url, callback) {
var xhr = new goog.net.XhrIo();
var lastIndex = -1;
var delimiter = '\n';
goog.events.listen(xhr, goog.net.EventType.READY_STATE_CHANGE, function() {
// As more data is loaded, look for the next delimiter so the JSON can // be extracted, parsed, and passed to the callback.
if ( xhr.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ) {
var str = xhr.getResponseText();
var index;
while ((index = str.indexOf(delimiter, lastIndex + 1)) != -1) {
var json = str.substring(lastIndex + 1, index);
callback(json);
lastIndex = index;
}
}
if (xhr.isComplete()) {
// Reconnect if the response finishes for any reason.
archiva.io.streamXhr(url, callback);
xhr.dispose();
}
});
xhr.send(url, 'POST');
};
并且 xhr.getReadyState() 没有这样的浏览器将是 3 并且getResponseText()将返回响应文本(当服务器端执行 writer.flush() 并且不需要 writer.close() 时)。
但是由于 IE < 10,在 state = 3 上不可能getResponseText(),只有 state == 4。并且 state 4 是关闭的状态。这就是为什么在刷新数据后需要关闭连接,因为其他情况下 IE 将继续加载数据并且永远不会处理它。但是可以在服务器端和关闭后管理数据量;
看这个链接,如何实现tomcat 7 comet
希望这有帮助