JavaScript结合AJAX_stream实现流式显示
当使用AJAX进行信息交互的时候,如果服务器返回的信息比较大,那么相对于传送完成之后的统一显示,流式显示就比较友好了。
流式实现
原理就是设置定时器,定时的查看AJAX对象的状态并更新内容,如果传送完成,就取消定时器。
functionajax_stream(url,data,element){
varxmlHttp=null;
if(window.XMLHttpRequest)
{//codeforIE7,Firefox,Opera,etc.
xmlHttp=newXMLHttpRequest();
}
elseif(window.ActiveXObject)
{//codeforIE6,IE5
xmlHttp=newActiveXObject("Microsoft.XMLHTTP");
}
if(xmlHttp==null)
{
alert("YourbrowserdoesnotsupportXMLHTTP.");
element.val('YourbrowserdoesnotsupportXMLHTTP.ClicktheLOGlinktomonitortheprocedure.');
return0;
}
varxhr=xmlHttp;
xhr.open('POST',url,true);
//如果需要像HTML表单那样POST数据,请使用setRequestHeader()来添加HTTP头。然后在send()方法中规定您希望发送的数据:
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send(data);
vartimer;
timer=window.setInterval(function(){
if(xhr.readyState==XMLHttpRequest.DONE){
window.clearTimeout(timer);
}
element.val(xhr.responseText);
},1000);
}
post数据转换
由于标准实现中的send只能接受以下几种输入,所以需要提前对需要传递的数据对象转换为字符串或者FormData格式,这一点就不如JQuery的方便了,但是JQuery如何在传输中间实现事件响应还不得而知,所以不能用,再或者把所有的对象转换中JSON。
voidsend(); voidsend(ArrayBufferdata); voidsend(Blobdata); voidsend(Documentdata); voidsend(DOMString?data); voidsend(FormDatadata);
下面是转换的代码,如果浏览器支持FormData就转换,否则转成字符串。
functionajax_generate_data(jsobj){
vari;
if(window.FormData){
vardata=newFormData();
foriinjsobj{
data.append(i,jsobj[i]);
}
}else{
vardata='';
vardatas=[];
foriinjsobj{
//forthevaluessothatpossible&containedinthestringsdonotbreaktheformat
varvalue=encodeURIComponent(jsobj[i]);
datas.append(i+'='+value);
}
data=datas.join('&')
}
console.log(data);
returndata;
}