Ajax原理-原生js的XMLHttpRequest对象意义

  Ajax是对Asynchronous JavaScript + XML的简写,这一技术能够向服务器请求额外的数据而无需卸载页面,会带来很好的用户体验。Ajax技术的核心是XMLHttpRequest(简称XHR)对象,XHR为向服务器发送请求和解析服务器响应提供了流畅的接口,能够以异步方式从服务器府区区获取更多信息而不必刷新页面。使用XML对象取得新数据然后在通过DOM将新数据插入到页面中。

一:XMLHttpRequest对象
  IE5是第一款引入XHR对象的浏览器,XHR对象是通过MSXML库中的一个ActiveX对象实现的。因此,在IE中可能会遇到三种不同版本的XHR对象:MSXML2.XMLHttp、MSXML2.XMLHttp.3.0、MSXML2.XMLHttp.6.0 。例如:

function createXHR(){
        if(typeof arguments.callee.activeXString != 'string'){
            var versions = ['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp','MSXML2.XMLHttp.3.0'];
            for(var i=0; i<versions.length; i++){
                try{
                    new ActiveXObject(versions[i]);
                    arguments.callee.activeXString = versions[i];
                    break;
                }catch(e){
                    console.log('no');
                }
            }
        }
        return new ActiveXObject(arguments.callee.activeXString);
    }

这个函数会根据IE中可用的MSXML库的情况创建最新版本的XHR对象,IE7Firefox、Opera、Chrome和Safari都支持原生的XHR对象,在这些浏览器中创建XHR对象要这样:var xhr = new XMLHttpRequest();,加入你想支持IE7及更高的版本,那么,大可丢掉前面定义的哪个函数,而只用原生的XHR实现。但是,如果你必须要使用IE更早的版本,可以在这个createXHR()函数中加入原生XHR对象的支持。

function createXHR() {
            if(XMLHttpRequest) {
                return new XMLHttpRequest();
            } else if(ActiveXObject) {
                if(typeof arguments.callee.activeXString != 'string') {
                    var versions = ['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.3.0'];
                    for(var i = 0; i < versions.length; i++) {
                        try {
                            new ActiveXObject(versions[i]);
                            arguments.callee.activeXString = versions[i];
                            break;
                        } catch(e) {
                            console.log('no');
                        }
                    }
                }
                return new ActiveXObject(arguments.callee.activeXString);
            } else {
                throw new Error("No XHR object available");
            }
        }

二:XHR的用法?
  使用XHR对象时,要调用的第一个方法是open(),例如:

xhr.open('get','somfile.txt',false);
xhr.send(null);

这里send()方法,如果不需要向请求主体发送数据,最好传入null参数,因为这个参数对有些浏览器来说是必须的。
  由于这次响应式同步的,所以,js代码会等到服务器响应之后再继续执行。收到响应后,响应数据会自动填充XHR对象的属性,相关属性如下:
responseText:作为响应主体被返回的文本;
responseXML:作为相应的内容类型是text/xml或application/xml,这个属性中将保存包含着相应数据的XMLDOM文档;
status:相应的http状态;
statusText:http状态的说明。
在接收到响应之后,第一步检查status属性,当xhr.status为200时候,说明接受成功,当xhr.status为304的时候,表示请求的资源没有被修改,可以直接使用浏览器中缓存的版本。代码如下:

if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
                    document.getElementById("myDiv").innerHTML = xhr.responseText;
                } else {
                    "Request was unsuccessful: "  + xhr.status;
                }

  异步用法
  大多数情况下我们是要发送异步请求,才能让JavaScript继续执行当前的活动阶段。取值如下:
0:未初始化,尚未调用open()方法。
1.启动。已经调用open()方法,但尚未调用send()方法。
2.发送,已经调用send()方法,为接受到响应。
3.接受。已经接受部分响应数据。
4.完成。全部接受响应的数据,并且可以在客户端使用。
只要readyState属性的值发生改变,都会触发一次onreadyStateChange事件。代码如下:

function loadXMLDoc() {
            var xhr = createXHR();
            xhr.onreadystatechange = function() {
                console.log(xhr)
                if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
                    document.getElementById("myDiv").innerHTML = xhr.responseText;
                } else {
                    "Request was unsuccessful: "  + xhr.status;
                }
            }

            xhr.open('GET',true);
            xhr.send(null);
        }

另外,在接收到响应之前,还可以调用abort()方法,取消异步请求:xhr.abort();
三:用setRequestHeader设置自定义请求头
这个方法接受两个参数:头部字段的名称和头部字段的值。服务器在接受到这种自定义的头部信息之后,可以执行后续操作,建议使用,否则可能会影响到服务器的响应。

function loadXMLDoc(){
            var xhr = createXHR();
            xhr.onreadystatechange = function(){
                if(xhr.readyState==4 || xhr.status==200){
                    document.getElementById("myDiv").innerHTML = xhr.responseText;
                }else{
                    "Request was unsuccessful: "  + xhr.status;
                }
            }
            xhr.open('GET',true);
            xhr.setRequestHeader('MyHeader','MyValue');
            xhr.send(null);
        }

四:GET请求
  对XHR而言,位于传入open()方法的URL末尾的查询字符串必须经过正确的编码才行。
使用GET请求经常会发生的一个错误,就是查询字符串格式有问题。查询字符串中每个参数的名称和值都必须使用encodeURIComponent()进行编码,然后才能放到URL的末尾,而且所用名-值对都必须由&分割,如下面所示:

<body>
        name:
        <input type="text" name="name">
        <br> book:
        <input type="text" name="book">
        <br>
        <input type="button" id="submit" value="submit" >
</body>
<script type="text/javascript"> function createXHR() { if (XMLHttpRequest) { return new XMLHttpRequest(); } else { return new ActiveXObject('Microsoft.XMLHTTP'); } }; //get方式,键值对加工 function addURLParam(url,name,value) { url += (url.indexOf('?') == -1 ? '?' : '&'); url += encodeURIComponent(name) + '=' + encodeURIComponent(value); return url; } //模拟表单提交 function formSubmit() { //获取文本框节点 var names = document.querySelectorAll('input')[0].value; var books = document.querySelectorAll('input')[1].value; console.log(names) var xhr = createXHR(); xhr.onreadystatechange = function () { if (xhr.readyState == 4 || xhr.status == 200) { console.log(xhr.responseText) } } var url = '01.PHP'; //添加参数 url = addURLParam(url,'name',names); url = addURLParam(url,'book',books); console.log(url) //初始化请求 xhr.open("get",url,true); xhr.send(null); } var sub = document.getElementById('submit'); sub.onclick = function(){ formSubmit(); } </script>

五:POST请求
  服务器对post请求不一样的,因此,服务器端必须有程序来读取发送过来的原始数据,并从中解析出有用的部分:首先,将Content-Type头部信息设置为application/x-www-form-urlencoded,也就是表单提交时的内容类型,其次是以适当的格式创建一个字符串,如果需要将POST数据进行序列化以便服务器方便处理,就需要XMLHttpRequest2级定义的FormData类型。即:

var data = new FormData();
data.append('name','bangbang');
... ...
xhr.open('post','02.PHP',true);
var form = document.getElementById('form1');
xhr.send(new FormData(form));

当然,我们可以用自定义的serialize()函数来处理。
例如:

<body>
    <form id="form1">
        name:
        <input type="text" name="name">
        <br> book:
        <input type="text" name="book">
        <br>
        <input type="button" id="submit" value="submit">
    </form>
    <div id="con"></div>
</body>
<script type="text/javascript"> //序列化函数 function serialize(form) { var parts = [],field = null,option,optValue; for (var i = 0; i < form.elements.length; i++) { field = form.elements[i]; switch (field.type) { case "select-one": case "select-multiple": if (field.name.length) { for (var j = 0; j < field.options.length; j++) { option = field.options[j]; if (option.selected) { optValue = ''; if (optioin.hasAttribute) { optValue = (option.hasAttribute('value') ? option.value : option.text); } else { optValue = (option.attributes['value'].specified ? option.value : option.text); } parts.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(optValue)); } } } break; case undefined: //字段集 case 'file': //文件输入 case 'submit': //提交按钮 case 'reset': //重置按钮 case 'button': //自定义按钮 break; case 'radio': //单选按钮 case 'checkBox': //复选框 if (!field.checked) { break; } default: if (field.name.length) { parts.push(encodeURIComponent(field.name) + '=' + encodeURIComponent(field.value)); } } } return parts.join('&'); } function createXHR() { if (XMLHttpRequest) { return new XMLHttpRequest(); } else { return new ActiveXObject('Microsoft.XMLHTTP'); } }; function formSubmit() { var xhr = createXHR(); console.log(xhr.readyState); xhr.onreadystatechange = function () { if (xhr.readyState == 4 || xhr.status == 200) { console.log(xhr.responseText); document.getElementById('con').innerHTML = xhr.responseText; } } //初始化请求 xhr.open("post",true); xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); var form = document.getElementById('form1'); console.log(serialize(form)); xhr.send(serialize(form)); } var sub = document.getElementById('submit'); sub.onclick = function () { formSubmit(); } </script>

Ajax原理-原生js的XMLHttpRequest对象意义的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5适合的情人节礼物有纪念日期功能

    这篇文章主要介绍了HTML5适合的情人节礼物有纪念日期功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. xcode4 – 如何在安装Xcode 5的同时使用Xcode 4打开项目文件

    Xcode4仍然是我开发iOS的主要IDE.为了尝试即将推出的iOS7,我安装了Xcode5DeveloperPreview,现在所有用于在Xcode4中打开的文件现在都在Xcode5中打开.如何在不卸载Xcode5的情况下将Xcode4恢复为默认编辑器?解决方法在阅读OSX中的LaunchServices之后,我终于找到了解决方案,感谢提示@peter-m.要修改某个应用程序的文件关联,可以使用

  5. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  6. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  7. Swift与Js通过WebView交互

    开发环境:Swfit2.3XCode8.2基础概念jscontext,jscontext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码JSValue,JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等JSExport,JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用Swif

  8. JSCore swift

    如果双方相互引用,会造成循环引用,而导致内存泄露。以上是Jscore的基本使用,比较简单

  9. Swift WKWebView的js调用swift

    最近项目需求,需要用到JavaScriptCore和WebKit,但是网上的资源有限,而且比较杂,都是一个博客复制另外一个博客,都没有去实际敲代码验证,下面给大家分享一下我的学习过程。

  10. Swift WKWebView的swift调用js

    不多说,直接上代码:在html里面要添加的的代码,显示swift传过去的参数:这样就实现了swift给js传参数和调用!

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部