Ajax我选择这样入门

什么是AJAX?

AJAX的意思就是异步的JavaScript和XML。简而言之,它是使用XMLHttpRequest对象与服务器端通信的脚本语言。它可以发送及接收各种格式的信息,包括JSON、XML、HTML和文本文件。AJAX最为吸引人的就是它的“异步”特性,这意味着AJAX可以无需刷新页面而与服务器端进行通信。允许你根据用户事件来更新部分页面内容。

可以考虑的两个特性:

  • 向服务器端发送请求,而不用重新加载页面。
  • 从服务器端接收数据并处理。

第一步:如何发送一个HTTP请求

需要通过XMLHttpRequest实现使用JavaScript向服务器端发送一个HTTP请求。而Internet Explorer(IE)中引入一个名为XMLHTTP的ActiveX对象实现与XMLHttpRequest相同的功能,Mozilla、Safari和其他浏览器则使用XMLHttpRequest。

如果要兼容各个浏览器的话,可以这样来做:

123456
var httpRequest;if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ...    httpRequest = new XMLHttpRequest();} else if (window.ActiveXObject) { // IE 6 and older    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");}

注意:出于演示目的,上面创建XMLHTTP实例是简化了的代码。关于更加真实的例子,请参阅本文的第三步。

接下来,当接收到服务器端响应时,需要告诉HTTP请求对象使用JavaScript函数来处理响应。将XMLHttpRequest对象的onreadystatechange属性设置为该函数的名称,当请求的状态变化时,该函数会被调用。

1
httpRequest.onreadystatechange = nameOfTheFunction;

注意:该函数名没有传递参数的括号和参数,这表示只是分配了一个函数的引用,而不是真正调用该函数。当然,也可以动态定义一个匿名函数,这样可以实时地处理响应。

123
httpRequest.onreadystatechange = function(){    // process the server response};

在处理完服务器端的响应之后,我们就可以调用XMLHttpRequest对象的open()和send()方法向服务器端发送请求了。

12
httpRequest.open(‘GET‘, ‘http://www.example.org/some.file‘, true);httpRequest.send(null);
  • open()方法的第一个参数:HTTP请求方法 - GET、POST、HEAD及任何服务器端支持的方法。根据HTTP标准保持大写,否则一些浏览器(例如火狐)可能无法处理请求。关于HTTP请求方法的更多信息,你可以查看W3C规范
  • open()方法的第二个参数:请求的URL。出于安全考虑,不能调用第三方域的页面内容。当调用open()方法时,一定确认使用相同域名内的页面,否则会得到“permission denied”的错误提示。常见的错误是使用domain.tld访问网站,却使用www.domain.tld来请求页面。如果真的需要发送一个请求到另一个域的话,可以查看HTTP访问控制
  • open()方法的第三个参数:可选,是否是异步请求。如果是true(默认值),表示是异步请求。

send()方法的参数表示当请求为POST时,向服务器端发送请求的数据内容。如果发送的是表单数据格式的话,服务器端可以向字符串一样地解析。

1
"name=value&anothername="+encodeURIComponent(myVar)+"&so=on"

向服务器端发送的数据格式也可以是JSON、SOAP等格式。

注意:如果使用POST方式发送数据的话,在调用send()方法前,需要设置请求的MIME类型。:

1
httpRequest.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);

第二步:处理服务器端的响应

当发送请求时,已经定义了一个函数来处理响应。

1
httpRequest.onreadystatechange = nameOfTheFunction;

这个函数可以做什么呢?首先,该函数需要检查请求的状态。如果状态值为4的话,这表示接收到完成的服务器端响应,可以继续处理。

12345
if (httpRequest.readyState === 4) {    // everything is good, the response is received} else {    // still not ready}

readyState的值列表如下:

  • 0 - 未初始化
  • 1 - 正在加载
  • 2 - 加载完毕
  • 3 - 交互中
  • 4 - 完成

接下来需要检查HTTP服务器端响应的状态代码,W3C网站 列出了所有的状态代码。下面的例子中,通过是否为200 OK的状态码来判断AJAX调用是否是成功的。

1234567
if (httpRequest.status === 200) {    // perfect!} else {    // there was a problem with the request,    // for example the response may contain a 404 (Not Found)    // or 500 (Internal Server Error) response code}

在检查了请求的状态和响应的状态码后,就可以接收服务器端发送的数据并处理。有两种选项访问这些数据:

  • httpRequest.responseText - 将服务器端响应作为文本字符串返回
  • httpRequest.responseXML - 将响应作为一个XMLDocument对象返回,该对象可以使用JavaScript DOM函数进行遍历。

注意,上述步骤只有异步请求(open()方法的第三个参数设置为true)时才是有效的。如果使用同步请求的话,是不需要指定函数的。在调用send()方法后就可以访问到服务器端返回的数据,因为脚本会停止并等待服务器端的响应。

第三步:一个简单的例子

下面来做一个简单的HTTP请求。JavaScript将请求一个包含“I’m a test.”文本的“test.html”HTML文档,然后使用alert()方法打印test.html文件的内容。

12345678910111213141516171819202122232425262728293031323334353637383940414243
<span id="ajaxButton" style="cursor: pointer; text-decoration: underline">  Make a request</span><script type="text/javascript">(function() {  var httpRequest;  document.getElementById("ajaxButton").onclick = function() { makeRequest(‘test.html‘); };

  function makeRequest(url) {    if (window.XMLHttpRequest) { // Mozilla, Safari, ...      httpRequest = new XMLHttpRequest();    } else if (window.ActiveXObject) { // IE      try {        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");      }       catch (e) {        try {          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");        }         catch (e) {}      }    }

    if (!httpRequest) {      alert(‘Giving up :( Cannot create an XMLHTTP instance‘);      return false;    }    httpRequest.onreadystatechange = alertContents;    httpRequest.open(‘GET‘, url);    httpRequest.send();  }

  function alertContents() {    if (httpRequest.readyState === 4) {      if (httpRequest.status === 200) {        alert(httpRequest.responseText);      } else {        alert(‘There was a problem with the request.‘);      }    }  }})();</script>

在这个例子中:

  • 在浏览器中用户单击“Make a request”链接;
  • 事件处理器调用makeRequest()方法,通过向该函数传递的参数,请求一个处在同一目录中的“test.html”HTML文件;
  • 请求后,(onreadystatechange)执行 alertContents()方法;
  • alertContents()方法用于检查如果正确地接收到响应,利用alert()方法打印“test.html”文件包含的内容。

注意:如果你发送一个请求后返回的是一段XML代码,而不是一个静态的XML文件的话,在Internet Explorer中必须设置一些响应头。如果没有设置响应头“Content-Type: application/xml”的话,当试图访问XML元素时IE将抛出一个”Object Expected”的JavaScript错误。

注意:如果没有设置头“Cache-Control: no-cache”的话,浏览器将缓存响应并不会重新提交请求。可以添加像时间戳或一个随机数的不同GET请求参数(参考 bypassing the cache)。

注意:如果httpRequest变量是全局的,makeRequest()方法因为冲突可能会被重写。将httpRequest变量定义在一个闭包中的话,可以避免AJAX函数的冲突。

注意:如果出现通信错误(如服务器端被关闭),当试图访问状态字段时在onreadystatechange的方法中将会抛出一个异常。确保if语句声明在try..catch语句中。

1234567891011121314
function alertContents() {  try {    if (httpRequest.readyState === 4) {      if (httpRequest.status === 200) {        alert(httpRequest.responseText);      } else {        alert(‘There was a problem with the request.‘);      }    }  }  catch( e ) {    alert(‘Caught Exception: ‘ + e.description);  }}

第四步:使用XML进行响应

在前面的例子中,当接收到响应后使用XMLHttpRequest对象的responseText属性访问“test.html”文件包含的内容。现在尝试一下responseXML属性。

首先,创建一个用于请求的名为“test.xml”的有效XML文档,代码如下:

1234
<?xml version="1.0" ?><root>    I‘m a test.</root>

在脚本中,只需要修改请求行:

1
onclick="makeRequest(‘test.xml‘)">

然后在alertContents()方法中,需要使用如下代码替换alert(httpRequest.responseText);这一行代码:

123
var xmldoc = httpRequest.responseXML;var root_node = xmldoc.getElementsByTagName(‘root‘).item(0);alert(root_node.firstChild.data);

这段代码需要由responseXML给予的XMLDocument对象,然后使用DOM方法来访问XML文档中的数据。

第五步:处理数据

最后,向服务器端发送一些数据并接收响应。这次JavaScript脚本请求一个动态页面“test.php”,该页面将根据发送的数据返回一个“computedString”-“Hello, [user data]!”,并使用alert()方法进行打印。

首先,向HTML页面中添加一个文本框,用户可以通过该文本框输入他们的名字:

123456
<label>Your name:   <input type="text" id="ajaxTextbox" /></label><span id="ajaxButton" style="cursor: pointer; text-decoration: underline">  Make a request</span>

还需要添加一行事件处理器用于从文本框获取用户的数据,并将该数据随着URL传递给makeRequest()方法:

1234
document.getElementById("ajaxButton").onclick = function() {     var userName = document.getElementById("ajaxTextbox").value;    makeRequest(‘test.php‘,userName); };

修改makeRequest()方法用于接收用户数据并发送给服务器端。将请求方式从GET修改为POST,用户数据作为参数传递给httpRequest.send()方法:

123456789
function makeRequest(url, userName) {

  ...

  httpRequest.onreadystatechange = alertContents;  httpRequest.open(‘POST‘, url);  httpRequest.setRequestHeader(‘Content-Type‘, ‘application/x-www-form-urlencoded‘);  httpRequest.send(‘userName=‘ + encodeURIComponent(userName));}

alertContents()方法可以向第三步一样利用alert()方法打印服务器端返回的数据。假设服务器端返回的是computedString和用户数据的话,如果用户在文本框中输入“Jane”服务器端响应的内容会像是这样:

{“userData”:”Jane”,”computedString”:”Hi, Jane!”}

在alertContents()方法中使用这些数据,不仅可以使用alert()方法打印responseText的内容,还可以将其解析并打印computedString属性内容:

12345678910
function alertContents() {  if (httpRequest.readyState === 4) {    if (httpRequest.status === 200) {      var response = JSON.parse(httpRequest.responseText);      alert(response.computedString);    } else {      alert(‘There was a problem with the request.‘);    }  }}
时间: 2024-08-06 20:00:39

Ajax我选择这样入门的相关文章

AJAX技术简介及入门实例

最近在学校参加暑期实习,参与的是一个社交网站项目,学长那边分配给的任务是前端开发,需要学习AJAX技术. 对于一个像我一样刚刚接触Web开发且无多少实际项目经验的新手而言,AJAX技术显得复杂而又深奥.经过两天的baidu.google,我对AJAX的基本原理有了一个大致的认识,在此总结一下. 1. 什么是AJAX? AJAX全称是异步的JavaScript和XML,是Asynchronous JavaScript and XML的缩写.AJAX技术用于创建交互式网页应用的网站开发,至于何为异步

Ajax IBM系列一 入门级别

Ajax 由 HTML.JavaScript? 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序 一).介绍Ajax 是干什么的 桌面应用程序       :桌面应用程序通常以 CD 为介质(有时候可从网站下载)并完全安装到您的计算机上.桌面应用程序可能使用互联网下载更新,但运行这些应用程序的代码在桌面计算机上 Web 应用程序          :Web 应用程序运行在某处的 Web 服务器上 -- 毫不奇怪,要通过 Web 浏览器

Ajax提高篇(1)入门

学习目的:理解 Ajax 及其工作原理,构建网站的一种有效方法. Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 下面是 Ajax 应用程序所用到的基本技术:? HTML 用于建立 Web 表单并确定应用程序其他部分使用的字段. ? JavaScript 代码是运行 Ajax 应用程序的核心代码,帮助改进与服务器应用程序的通信. ? DHTML 或 Dynamic HTML,用于动态更新表单.我们将使用 div.span 和其他动态

如何选择编程入门语言?一个让很多人纠结的问题

用心分享,共同成长 没有什么比你每天进步一点点更实在了 本文已经收录至我的github,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 点关注,不迷路!!! 为什么会出这样一篇文章? ?本来想写点最近学习的东西,但是最近好多粉丝再问我一个问题. image-20200105164345384 于是我决定把我这个过来人的一些建议给到你们,希望大家少一些不必要的迷茫,多花点时间去学习该学习的东西,去做一些重要的事情. 刚开始学习

对于if判断和switch选择的入门理解

今天是分享一下流程控制语句中对if判断和switch选择的初步了解,让我们来看一下这两者的代码结构. if 判断: if(条件1) {代码1} else if(条件2) {代码2} else{代码n} if判断中的条件都必须为bool类型.代码可以是任意功能,任意数目.表示如果条件1成立,则执行代码1,否则判断条件2是否成立,如果成立,则执行代码2.所有条件都不成立则执行代码n.其中最后else的部分是可以省略的,表示如果以上条件都不成立,判断结束.else if可以重复任意次数. 举一个简单的

ajax日期选择

主页面 <body> <input type="text" id="riqi" /> <!-- 模态框(Modal) --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-

Ajax 之jquery(4) 入门jQuery之一

这是否意味着如果你尚未成为脚本编程高手,就无法在自己的网站中善用JavaScript 呢?完全不是!本章将向你展示如何利用JavaScript 工具包:借助已经预先编写好的库和函数框架,你会在项目实践中真切地感受到脚本编程的强大.目前有许多工具包可供下载,而且大部分都是免费的.本书选用了可免费下载且开源的实用程序和控件集jQuery(jquery.com)来构建交互式Web 应用程序.我们认为它是最出色的JavaScript 库之一.在接下来的几章中,我们将介绍如何使用jQuery 来拖放页面元

使用Ajax技术的一个入门案例

//当页面加载完毕之后,执行以下代码window.onload = function(){    document.getElementById("ok").onclick = function(){        /*         * 1    创建XMLHttpRequest对象         */          var xhr = ajaxFunction();                /*         * 2    服务器向浏览器响应请求         *

Jquery入门(一)

很早前就看到Jquery,但是博客一直没写,因为一直没用到,校招也忙成狗了.先是去了一家小创业公司,环境确实不错,不过后面又拿到另外一家的offer,考虑之后最后还是去另外一家.最后还是进入了一家我个人还是觉得很满意的公司,环境条件是我大学里面就很憧憬的,鼓掌!!!!!!鼓掌!!!!!! 互联网公司的工作氛围比较轻松融洽.没ps3,xbox但是有一张桌上足球桌.其实我大学里最喜欢的是类似豌豆荚这样企业文化的公司,有个简简单单的阿姨,简简单单的人际关系,最重要的,有好吃的.不过,实力问题,豌豆荚这