ajax与commet

Posted fqh123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ajax与commet相关的知识,希望对你有一定的参考价值。

在XHR出现之前,Ajax的通信必须借助一些hack手段来实现,大多是使用隐藏的框架或内嵌框架。XHR为向服务器发送请求和解析服务器响应提供了流畅的接口。能够以异步方式从服务器取得更多信息,意味着用户单击后,可以不必刷新页面也能取得新数据。虽然名字中包含XML成分,但Ajax通信与数据格式无关;这种技术就是无需刷新页面即可从服务器取得数据,但不一定是XML数据。人们也通常将这种技术成为远程脚本。

XMLHttpRequest对象

IE5是第一款引入XHR对象的浏览器。在IE5中,XHR对象是通过MSXML库中的一个ActiveX对象实现的。因此在IE中可能会遇到三种不同版本的XHR对象,即MSXML2.XMLHttp、MSXML2.XMLHttp.3.0和MSXMLHttp.6.0。要使用MSXML库中的XHR对象,需要像第18章讨论创建XML文档时一样,编写一个函数,例如:

    // 适用于IE7之前版本
      //此方法会返回一个XHR对象
      function createXHR(){
            if(typeof arguments.callee.activeXString!="string"){//检测函数体的自定义属性activeXString的值不是string类型,因为后面会自定义这个属性,并为其赋值
                  var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
                        i,
                        len;
                  for(i=0,len=versions.length;i<len;i++){
                        try{
                              new ActiveXObject(versions[i]);//创建一个ActiveX类型的一个实例(需要版本号),若不支持这个版本会报错
                              arguments.callee.activeXString=versions[i];//为函数体自定义activeXString属性,并将版本号赋值给它
                              break;
                        }catch(ex){
                              //跳过
                        }
                  }  
            }
            return new ActiveXObject(arguments.callee.activeXString);
      }

IE7+、firefox、opera、chrome、safari都支持XHR对象,在这些浏览器中创建XHR对象要像下面这样使用:

    var xhr=new XMLHttpRequest();

然后我们就可以将IE7之前的和IE7之后的封装成一个跨浏览器创建XHR对象的方法,适合任何浏览器任何版本!!

    function createXHR(){
            if(typeof XMLHttpRequest!="undefined"){//检测是否支持XMLHttpRequest原生对象
                  return new XMLHttpRequest();
            }else if(typeof ActiveXObject!="undefined"){
                  if(typeof arguments.callee.activeXString!="string"){//检测函数体的自定义属性activeXString的值不是string类型,因为后面会自定义这个属性,并为其赋值
                        var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"],
                              i,
                              len;
                        for(i=0,len=versions.length;i<len;i++){
                              try{
                                    new ActiveXObject(versions[i]);//创建一个ActiveX类型的一个实例(需要版本号),若不支持这个版本会报错
                                    arguments.callee.activeXString=versions[i];//为函数体自定义activeXString属性,并将版本号赋值给它
                                    break;
                              }catch(ex){
                                    //跳过
                              }
                        }  
                  }
                  return new ActiveXObject(arguments.callee.activeXString);
            }else{
                  throw new Error("No XHR object available.");
            }
      }

使用:

    var xhr=createXHR();

XHR对象的用法

在使用XHR对象时,要调用的第一个方法是open(),它接收3个参数:要发送的请求的类型(get、post等等)、请求的URL和表示是否异步发送请求的布尔值。:

    xhr.open("get","example.php",false);

这行代码会启动一个针对example.php的GET请求。有关这行代码,需要说明两点:一是URL相对于执行代码的当前页面(当然也可以用绝对路径);二是调用open()方法并不会真正发送请求,而只是启动一个请求以备发送

注意:只能向同一个域中使用相同端口和协议的URL发送请求。如果URL与启动请求的页面有任何差别,都会引发安全错误。

发送特定的请求,必须像下面这样调用send()方法

    xhr.send(null);

这里的send()方法接收一个参数,即要作为请求主体发送的数据。如果不需要通过请求主体发送数据,则必须传入null,因为这个参数对有些浏览器来说是必要的。调用send()之后,请求就会被分派到服务器。

由于这次请求是同步的,javascript代码会等到服务器响应之后再继续执行。在收到响应之后,响应的数据就会自动填充XHR对象的属性,相关属性简介如下:

responseText:作为响应主体被返回的文本。

responseXML:如果响应的内容类型是“text/xml”或"application/xml",这个属性中将保存包含着响应数据的XML DOM文档。

status:响应的HTTP状态。

statusText:HTTP状态说明。

在接收到响应之后,第一步是检测status属性,以确定响应已经成功返回。一般来说,可以将HTTP状态码为200作为成功的标志。此时,reponseText属性的内容已经就绪,而且在内容类型正确的情况下,responseXML也应该能够访问了。此外,状态码为304表示请求的资源并没有被修改,可以直接使用浏览器中缓存的版本;当然,也意味着响应是有效的。为确保接收到适应的响应,应该像下面这样检查上述两种状态代码:

    if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
            console.log(xhr.responseText);
      }else{
            console.log("Request was unsuccessful:"+xhr.status);
      }

无论内容类型是什么,响应主体的内容都会保存到responseText属性中;而对于非XML数据而言,responseXML属性的值将为null

像前面这样发送同步请求当然没有问题,但多数情况下,我们还是要发送异步请求,才能让javascript代码继续执行,而不必等待响应。此时可以检测XHR对象的readyState属性,该属性表示请求/响应过程的当前活动阶段。这个属性可取的值如下:

0:未初始化。尚未调用open()方法。

1:启动。已经调用open()方法,但尚未调用send()方法。

2:发送。已经调用send()方法,但尚未接收到响应。

3:接收,已经接收到部分响应数据。

4:完成,已经接收到全部响应数据,而且已经可以在客户端使用了。

只要readyState属性值有一个值变成另一个值,都会触发一下readystatechange事件。可以利用这个事件来检测每次状态变化后readyState的值。通常我们只对readyState的值为4的阶段感兴趣,因为这时所有数据都已经就绪。不过,必须在地哦啊用open()之前指定onreadystatechange事件处理程序才能确保跨浏览器兼容性,例如:

    var xhr=createXHR();
      xhr.onreadystatechange=function(){
            if(xhr.readyState==4){
                  if((xhr.status>=200&&xhr.status<300)||xhr.status==304){
                        console.log(xhr.responseText);
                  }else{
                        console.log("Request was unsuccessful:"+xhr.status);
                  }
            }
      }
      xhr.open("get","example.php",false);
      xhr.send(null);

另外,在接收到响应之前还可以调用abort()方法来取消异步请求:

    xhr.abort();

调用这个方法之后,XHR对象会停止触发事件,而且也不允许访问任何与响应有关的对象属性。在终止请求之后,还应该对XHR对象进行解引用操作。由于内存原因,不建议重用XHR对象。

 

以上是关于ajax与commet的主要内容,如果未能解决你的问题,请参考以下文章

代码适用于与单个 html 文件不同的堆栈片段

AJAX相关JS代码片段和部分浏览器模型

ajax与 axios的基础讲解(附代码及接口)

Javascript代码片段在drupal中不起作用

前端面试题之手写promise

Ajax 片段元标记 - Googlebot 未读取页面内容