您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页利用Ajax脚本化HTTP

利用Ajax脚本化HTTP

来源:叨叨游戏网


load事件

使用load事件代替onreadystatechange事件,响应完毕后就触发load事件,没有必要再去检查readystate属性。
只要浏览器接收到服务器的响应,无论状态如何,都会触发load事件,所以需要确定status属性值从而确定数据是否可用。

举个栗子

var xml = new createXML();xml.onload = function(event){ 
 if((xml.status >= 200 && xml.status < 300) || xml.status === 304){ 
 var request = document.getElementById("request");
 request.innerHTML = xml.responseText;
 }else{
 console.log("request is not ok" + xml.status);
 }
}xml.open("get","hello-world.html",false);xml.send(null);

progress事件

这个时间会在浏览器接受新数据期间周期性的触发。而progress事件处理程序会接收到一个event对象,其中target属性就是XHR对象,还有其他三种属性:lengthConputable表示进度信息是否可用的布尔值,loaded表示已经接收到的字节数,total表示根据Content-Length响应头部确定的预期字节数。

举个栗子

var xml = new createXML();xml.onload = function(event){ 
 if((xml.status >= 200 && xml.status < 300) || xml.status === 304){ 
 var request = document.getElementById("request");
 request.innerHTML = xml.responseText;

 }else{
 console.log("request is not ok" + xml.status);
 }
}xml.onprogress = function(event){ 
 var p = document.getElementById("data"); 
 if(event.lengthComputable){
 console.log(event.position);
 p.innerHTML = "Received " + event.loaded + " of " + event.total + " bytes";
 }
}/*需要注意的是,必须保证调用open之前定义onprogress事件处理程序*/xml.open("get","hello-world.html",true);xml.send(null);

终止请求和请求超时abort()

举个栗子

function timeGetText(url,timeout,callback){
 var request = new XMLHttpRequest(); 
 var timedout = false; //判断是否超时
 var timer = setTimeout(function(){
 timedout = true;//超时
 request.abort();//触发终止事件
 },timeout);//如果超时,触发一个启动器
 request.open("GET",url);//发起请求
 request.onreadystatechange = function(){
 if(request.readyState !== 4) return;//忽略未完成程序
 if(timedout) return;//忽略超时程序
 clearTimeout(timer);//取消等待的超时
 if(request.status === 200){
 callback(request.responseText);//成功
 }
 }
 request.send(null);
}

图像ping

图像Ping最常用于跟踪用户点击页面或动态广告曝光次数。图像Ping有两个主要的缺点,一是只能发送GET请求,二是无法访问服务器的响应文本。

var img = new Image();
img.onload = img.onerror = function(){
 console.log("Done!");
};
img.src = "hello-world.html";

借助<script>发送HTTP请求:JSONP

  • 设置script元素也可以作为一种AJAX传输机制,只需要设置其src属性,浏览器就会发送一个HTTP请求以下载src属性指定的URL。

  • 使用这种方法进行传输的主要原因是它不受同源策略的影响,因此可以使用他们从其他服务器请求数据,还有一个原因是包含JSON数据的响应体会自动解码。

  • JSONP是JSON with padding的缩写。和JSON差不多,只不过是被包含在函数调用中的JSON。

  • JSONP由两部分组成,回调函数和数据。

  • 举个栗子

    var bd = document.body;function callbackFunction(result, methodName)
     {
     bd.innerText = result;
     }
     var script = document.createElement("script");
     script.src = "***/jsonp.php?jsoncallback=callbackFunction";
     bd.insertBefore(script,bd.firstChild);
  • 但是,不会强制指定客户端必须实现的回调函数,它们使用查询参数的值,允许客户端指定一个函数名,然后使用函数名去响应

  • 举个栗子

    function getJSONP(url,callback){
     var cbnum = "cb" + getJSONP.counter++; 
     var cbname = "getJSONP." + cbnum; 
     if(url.indexOf("?") === -1){
     url += "?jsonp=" + cbname;
     }else{
     url += "&jsonp=" + cbname;
     } var script = document.createElement("script");
     getJSONP[cbname] = function(response){
     try{
     callback(response);
     } finally{ delete getJSONP[cbname];
     script.parentNode.removeChild(script);
     }
     }
     script.src = url;
     document.body.appendChild(script);
    }
    getJSONP.counter = 0;

    Conmet技术(服务器推送)

  • 有两种实现Comet的方式:长轮询和流。

  • 长轮询把传统轮询颠倒了一下,页面发送一个到服务器的请求,然后服务器一直保持连接打开,知道有数据可发送。发送完数据后,浏览器关闭连接,随即又发起一个到服务器的新请求。这个过程在页面打开期间一直不断持续。

  • 第二种流行的Comet方式是HTTP流。流在页面的整个生命周期中只使用一个HTTP连接。具体来说就是浏览器向服务器发送一个请求,然后服务器保持连接打开,然后周期性的向浏览器发送数据。

  • 举个栗子

    function createStreamingClient(url, progress/*接收到数据时调用的函数*/, finished/*关闭连接时调用的函数*/) {
     var xhr = new XMLHttpRequest(),
     received = 0;
     xhr.open("get", url, true);
     xhr.onreadystatechange = function() {
     var result; if (xhr.readyState == 3) {
     result = xhr.responseText.substring(received);
     received += result.length;
     progress(result);
     } else if (xhr.readyState == 4) {
     finished(xhr.responseText);
     }
     };
     xhr.send(null); return xhr;
    }var client = createStreamingCilent("streaming.php", function(data) {
     alert("Received:" + data);
    }, function(data) {
     alert("Done!");
    });

    服务器发送事件

    SSE( Server - Sent Events, 服务器发送事件) 是围绕只读Comet交互推出的API或者模式。 SSE API用于创建到服务器的单向连接, 服务器通过这个连接可以发送任意数量的数据。 服务器响应的MIME类型必须是text / event - stream, 而且是浏览器中的Javascript API能解析的格式输出。 SSE支持短轮询, 长轮询和HTTP流, 而且能够在断开连接时自动确定何时重新连接。

    SSE API

  • SSE是为javascript api与其他传递消息的javascript api很相似。 要预定新的事件流, 要创建新的EventSource对象, 并传入一个入口点:

  • var source = new EventSource("myevents.php");/*必须同源*/
  • EventSource的实例有一个readyState属性, 值为0表示正连接到服务器, 值为1表示打开了连接, 值为2表示关闭连接。还有三个事件:

  • open: 在建立连接时触发
    message: 在从服务器接收到新事件时触发
    error: 在无法建立连接时触发
    - 服务器返回的数据以字符串的格式保存在event.data中。 如果想强制立即断开并且不再重新连接, 可以调用close() 方法。

    事件流

  • 响应格式为纯文本。

  • 对于多个连续数据,需要使用换行符分割。

  • 在设置了ID之后, EventSource对象会跟踪上一次触发的事件。 如果连接断开, 会向服务器发送一个包含名为Last - Event - ID的特殊HTTP头部请求, 以便服务器知道下次触发那个事件。 在多次连接的事件流中, 这种机制保证了浏览器能够以正确的顺序接收到连接的数据段。

  • Web Sockets

  • WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。

  • 当创建web Sockets之后,会有一个http请求发送到浏览器以发起连接。在取得服务器响应后,建立的连接会从http协议交换为Web Socket协议

  • 由于使用了自定义的协议,未加密的URL是ws://,加密后的URLwss://

  • 好处是能够在客户端和服务器之间发送非常少的数据,而不必担心http那样字节级的开销。

  • var Socket = new WebSocket(url, [protocol]/*可接受的子协议*/ );//创建对象


    事件事件处理程序描述
    openSocket.onopen连接建立时触发
    messageSocket.onmessage客户端接收服务端数据时触发
    errorSocket.onerror通信发生错误时触发
    closeSocket.onclose连接关闭时触发

    参考文档——websocket

    AJax的主要特点是使用脚本操纵HTTP和web服务器之间的数据交换,不会导致页面重载。

    Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

    违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

    本站由北京市万商天勤律师事务所王兴未律师提供法律服务