`
gaozzsoft
  • 浏览: 426854 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

XHR-XMLHttpRequest简介(ZT)

    博客分类:
  • Ajax
阅读更多

XMLHttpRequest

XMLHttpRequest是一个函数,用来创建一个http请求。最初XHR是IE通过ActiveX对象实现的。以后各个浏览器都开始支持了。现在流行的AJAX就是通过XMLHttpRequest对象来实现的。总的来说ajax就是不必刷新整个页面而获取新的内容的一种方法。通过ajax我们可以做类似桌面的程序。

AJAX:Asynchronous Javascript and XML.

  • Asynchronous,向服务器发个请求,并不用等待返回。但是它可以做其他的事情并且通过一个事件来得知有一个相应返回。
  • Javascript,我们通过javascript来创建一个XHR对象。
  • XML,因为最初的开发人员都是用XHR请求一个XML文档。把它作为数据返回到页面上。现在比较流行用JSON的格式。

用XHR非常简单只需要两个步骤

  1. 发出一个请求,创建一个XHR对象,并且给它一个监听器。
  2. 处理响应,事件的监听器能得知响应的返回。这样代码就能处理这个响应了。

发送一个请求

为了用于演示,以下的代码在各个浏览器可能不太一样。

第一步创建一个XHR对象

Js代码 复制代码
  1. var xhr = new XMLHttpRequest();  
var xhr = new XMLHttpRequest();

第二步给readystatechange添加一个监听器。

Js代码 复制代码
  1. xhr.onreadystatechange = myCallback;  
xhr.onreadystatechange = myCallback;

第三步调用XHR对象的open方法

Js代码 复制代码
  1. xhr.open('GET''somefile.txt'true);  
xhr.open('GET', 'somefile.txt', true);

第一个参数是HTTP请求的类型,一般都是post和get。如果不需要向服务端发送大量的数据可以用get。不然的话就用post。第二个参数是请求的url。这个例子中是个相同目录下的somefile.txt文件。最后一个参数指定是否为异步。

第四步发送一个请求。

Js代码 复制代码
  1. xhr.send('');  
xhr.send('');

这个方法,可以向服务端发送数据。对于GET请求,是个空字符串。对于post请求它是个字符串 key=value&key2=value2

 

处理请求

我们已经给readystatechange加了一个监听器了。什么事ready state,它是怎样改变的呢?

XHR有个属性叫做readyState.它每次变化都会去执行readystatechange事件。

readyState属性的值如下

  • 0-uninitialized
  • 1-loading
  • 2-loaded
  • 3-interactive
  • 4-complete

当readyState的值为4的时候,也就是response返回了。在上个例子的myCallback函数中,在确认readyState值为4的之后,还要确认HTTP请求的status code(状态码).如请求了一个不存在的URL,http的状态码为404.如果状态码是200就说明是正确的了。所以,myCallback函数中会检查这个状态码。我们可以用过XHR的status属性来获取状态码。

 

所以如果readyState为4,http状态码为200,你就可以通过XHR的responseText属性访问请求URL的内容了。

具体看代码

Js代码 复制代码
  1. function myCallback() {   
  2.   if (xhr.readyState < 4) {   
  3.     return// 还没有返回   
  4.   }   
  5.   if (xhr.status !== 200) {   
  6.     alert('Error!'); // HTTP状态码错误。   
  7.     return;   
  8.   }   
  9.   //  查看返回的内容。   
  10.   alert(xhr.responseText);   
  11. }  
function myCallback() {
  if (xhr.readyState < 4) {
    return; // 还没有返回
  }
  if (xhr.status !== 200) {
    alert('Error!'); // HTTP状态码错误。
    return;
  }
  //  查看返回的内容。
  alert(xhr.responseText);
}

 通过xhr.responseText。你就可以获取请求URL内容,并且可以把它添加到当前的页面中了。

 

在IE浏览器中创建XHR对象

因为在IE中,是用ActiveX来创建XHR对象的。但是各个IE浏览器版本之间也有所不同。

因此如果要跨浏览器创建XHR对象,代码如下

Js代码 复制代码
  1. var ids = ['MSXML2.XMLHTTP.3.0',   
  2.            'MSXML2.XMLHTTP',   
  3.            'Microsoft.XMLHTTP'];   
  4.               
  5. var xhr;   
  6. if (typeof window.XMLHttpRequest === 'function') {   
  7.   xhr = new XMLHttpRequest();   
  8. else {   
  9.   for (var i = 0; i < ids.length; i++) {   
  10.     try {   
  11.       xhr = new ActiveXObject(ids[i]);   
  12.       break;   
  13.     } catch (e){}   
  14.   }    
  15. }  
var ids = ['MSXML2.XMLHTTP.3.0',
           'MSXML2.XMLHTTP',
           'Microsoft.XMLHTTP'];
           
var xhr;
if (typeof window.XMLHttpRequest === 'function') {
  xhr = new XMLHttpRequest();
} else {
  for (var i = 0; i < ids.length; i++) {
    try {
      xhr = new ActiveXObject(ids[i]);
      break;
    } catch (e){}
  } 
}

 来解释下上面的程序。首先这个ids数组存放着三个不同的ActiveX的ID。用来解决IE浏览器版本的问题。

 然后在检查window.XMLHttpRequest是否是个合法的函数。如果支持说明浏览器支持XMLHttpRequest(一般firefox,Safari,Opera都支持)。

 

关于异步

现在我们知道了怎样创建一个XHR以及处理响应。如果发出两个异步请求的话会怎么样呢?如果第二个响应在第一个响应之前返回呢?

 

在上个例子中XHR是个全局的对象myCallBack函数依赖于全局的XHR对象。如何避免用全局的变量呢,那就把回调函数封装为闭包。看下代码

Js代码 复制代码
  1. var xhr = new XMLHttpRequest();   
  2. xhr.onreadystatechange = (function(myxhr){   
  3.   return function(){myCallback(myxhr);}   
  4. })(xhr);   
  5. xhr.open('GET''somefile.txt'true);   
  6. xhr.send('');  
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = (function(myxhr){
  return function(){myCallback(myxhr);}
})(xhr);
xhr.open('GET', 'somefile.txt', true);
xhr.send('');

 这个例子中,myCallback函数接收了XHR对象,就不需要访问全局的XHR了。

 

关于XML

虽然JSON已经明显要比XML流行的多,但是XML仍然是一个好的选择。如果是XML文档,我们可以用responseXML来访问一个XML文档。这样返回的内容就可以用DOM解析的方式来读取了。如getElementsByTagName()等等。

分享到:
评论

相关推荐

    前端项目-i18next-xhr-backend.zip

    i18next-xhr-backend的作用是作为i18next的插件,通过浏览器的XMLHttpRequest (XHR) 技术来异步加载和更新翻译资源。这种方法在网页应用中非常常见,因为它允许在不刷新页面的情况下获取和更新内容。 xhr后端层的...

    xhr-mock:用于模拟 XMLHttpRequest 的实用程序

    xhr-mock 这个 repo 是一个由lernajs管理的 mono-repo。 可以在找到主要 NPM 包的文档。 :hammer_and_wrench: 发展安装依赖项: yarnyarn run bootstrapNPM 包构建并测试包: cd packages/xhr-mockyarn run build # ...

    XHR-10型动轨式升降脚手架介绍

    XHR-10型动轨式升降脚手架介绍

    xhr-eval-chunk-webpack-plugin:通过XHR + eval加载块,而不是创建 elements

    xhr-eval-chunk-webpack-plugin 通过XHR + eval加载块,而不是创建[removed]元素。 替换webpack的默认默认require.ensure运行时函数,以便它通过 + 加载块,而不是在DOM中添加[removed]元素。 如果您要在服务器上...

    AJAX学习总结(二)--XMLHttprequest实例

    **AJAX学习总结(二)--XMLHttpRequest实例** 在Web开发中,AJAX(Asynchronous JavaScript and XML)技术被广泛用于实现页面的无刷新更新,提高用户体验。本篇将聚焦于XMLHttpRequest对象,它是AJAX的核心,负责在...

    Ajax-xhr-chat.zip

    Ajax-xhr-chat.zip,基于ajax xmlhttprequest(xhr)的简单聊天。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载...

    XHR——XMLHttpRequest对象 - gaojun - 博客园1

    【XMLHttpRequest对象(XHR)详解】 XMLHttpRequest(XHR)对象是JavaScript中用于在后台与服务器进行异步数据交换的关键工具,它使得网页可以不需刷新就能获取或发送数据,是实现Ajax(Asynchronous JavaScript ...

    ajax --XMLHttpRequest

    XMLHttpRequest(XHR)是Ajax的基础,它允许JavaScript在后台与服务器通信。这个对象提供了发送HTTP请求并接收响应的能力,而且不会影响到用户对页面的交互。通常,一个Ajax请求包含以下步骤: 1. 创建...

    xhr-devtool-crx插件

    xhr-devtool-crx插件是一款专为开发者设计的Chrome扩展程序,主要功能是帮助开发者在进行Web应用开发和调试时,能够便捷地查看和修改XMLHttpRequest(XHR)请求的响应结果。这款插件以中文(简体)界面呈现,使得...

    usco-xhr-store

    node.js版本:src文件夹中的xhr-store.coffee polymer.js / browser版本,它是lib / xhr-store.js(上面的浏览器版本)xhr-store.html的组合 如何生成浏览器/polymer.js版本(需要支持): 类型: grunt build-...

    前端开源库-mock-xhr

    首先,我们需要理解XMLHttpRequest(XHR)在前端中的作用。XHR是浏览器提供的一种API,用于在后台与服务器进行异步通信,即我们常说的AJAX(Asynchronous JavaScript and XML)。通过创建XHR对象,我们可以发送GET、...

    xhr-form:[wip] 使用自定义元素创建异步表单元素

    xhr-形式 使用自定义元素创建异步表单元素。 wip,还没有像宣传的那样工作。 安装 $ npm install xhr-form 用法 document . registerElement ( 'xhr-form' , require ( '../' ) ) const form = domify ( ` &lt;...

    xhr-api-example:一个示例前端,它使用 xhr 请求来测试基于 Node 的 RESTful API 的端点

    xhr-api-example 是一个前端示例项目,主要用于演示如何使用 XMLHttpRequest(xhr)API 来与后端的 Node.js 驱动的 RESTful API 进行交互。RESTful API 是一种设计模式,它允许客户端通过 HTTP 方法(如 GET、POST、...

    Linux下以C构建WEB服务同时响应XHR(XMLHttpRequest)请求

    Linux下以C构建WEB服务并响应XHR(XMLHttpRequest)请求 具体可以参见该文 http://blog.csdn.net/xxdddail/article/details/18841325

    xhr-browserify:Browserify 兼容 xhr 模块,支持 jsonp

    xhr-browserify Browserify 兼容 xhr 模块,支持 jsonp 简单的情况,在域请求中。 var xhr = require('xhr-browserify'); xhr('/path/to/api?dogs=paws', function(err, data) { console.log(data); }); JSONP ...

    XHR-Object:一个小的XHR对象,可以轻松地执行XMLHttpRequests

    XHR对象轻松执行XMLHttpRequests的最小XHR对象如何发送POST示例const data = { id : 1 , name : 'Rose'} ;const url = 'test.html' ;xhr . request ( 'POST' , url , data , ( res ) =&gt; { console . log ( res ) ;} ...

    xhr-json:承诺的 JSON XHR

    xhr-json 承诺的 JSON XHR。 安装 $ npm install xhr-json 或者 $ component install nathan7/xhr-json 应用程序接口 xhrJson(网址,选项) xhrJson(选项) 获取给定的 URL(使用给定的选项),将响应解析为 ...

    simple-webserver-xhr-forms

    "simple-webserver-xhr-forms" 是一个基于JavaScript的简单Web服务器项目,它演示了如何使用XMLHttpRequest(XHR)处理HTML表单数据。这个项目主要适用于初学者,帮助他们理解Web开发中的基本交互机制,尤其是客户端...

    react-xhr-uploader:使用XMLHTTPRequest v2上载文件的React组件

    React XHR上载器 使用XMLHTTPRequest v2上载文件的React组件 在查看带有示例的完整文档 拉请求是受欢迎的。 如何在本地运行/开发 使用npm start在localhost:8080上运行webpack开发服务器。 启用热模块更换。 使用...

Global site tag (gtag.js) - Google Analytics