一、实例化 XMLHttpRequest 对象

使用 Ajax API 的第一件事情就是实例化 XMLHttpRequest 对象。

  1. var xhr = new XMLHttpRequest();

二、初始化请求

使用 XMLHttpRequest 对象时,要调用的第一个方法就是 open()。它不会真正发送请求,而只是初始化一个请求准备发送。

open() 方法接受三个参数:请求的类型(“GET”、“POST”等)、请求的资源地址和表示是否发送异步请求的布尔值(默认为 true)。

  1. xhr.open('GET', 'example.php', false);

启动一个同步 GET 请求,请求的资源地址为 example.php

三、发送请求

  1. xhr.send(null);

send() 方法接受一个参数,表示发送的请求主体数据。如果不需要发送请求主体数据,则必须输入 null,因为这个参数对有些浏览器来说是必需的。

四、GET 请求

HTML 代码:

  1. <div class="content"></div>

JavaScript 脚本:

  1. var xhr = new XMLHttpRequest();
  2. function addURLParam(url, name, value) {
  3. url += (url.indexOf('?') == -1 ? '?' : '&');
  4. url += encodeURIComponent(name) + '=' + encodeURIComponent(value);
  5. return url;
  6. }
  7. xhr.onreadystatechange = function(){
  8. if (xhr.readyState === 4) {
  9. if (xhr.status === 200) {
  10. document.querySelector('.content').innerHTML = xhr.responseText;
  11. } else {
  12. console.error(xhr.statusText);
  13. }
  14. }
  15. };
  16. xhr.onerror = function (e) {
  17. console.error(xhr.statusText);
  18. };
  19. var url = 'server.php';
  20. url = addURLParam(url, 'author', '张宝');
  21. url = addURLParam(url, 'article', 'XMLHttpRequest API 使用指南');
  22. xhr.open('GET', url, true);
  23. xhr.send(null);

PHP 处理脚本:

  1. if (isset($_GET["author"]) && isset($_GET["article"])) {
  2. echo "GET:《" . $_GET["article"] . "》 by " . $_GET["author"];
  3. }

五、POST 请求

POST 请求把数据作为请求主体提交。

5.1 使用序列化数据

HTML 代码:

  1. <div class="content"></div>

JavaScript 脚本:

  1. var xhr = new XMLHttpRequest();
  2. xhr.onreadystatechange = function(){
  3. if (xhr.readyState === 4) {
  4. if (xhr.status === 200) {
  5. document.querySelector('.content').innerHTML = xhr.responseText;
  6. } else {
  7. console.error(xhr.statusText);
  8. }
  9. }
  10. };
  11. xhr.onerror = function (e) {
  12. console.error(xhr.statusText);
  13. };
  14. var url = '../asset/source/server.php';
  15. xhr.open('POST', url);
  16. xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  17. xhr.send("foo=bar&lorem=ipsum");

PHP 处理脚本:

  1. if (isset($_POST["foo"]) && isset($_POST["lorem"])) {
  2. echo "POST: foo=" . $_POST["foo"] . "&lorem=" . $_POST["lorem"];
  3. }

5.2 使用序列化后的表单数据

HTML 代码:

  1. <div class="content">
  2. <form id="postForm">
  3. <input type="text" value="bar" name="foo"><input type="text" value="ipsum" name="lorem">
  4. </form>
  5. </div>

JavaScript 脚本:

  1. var xhr = new XMLHttpRequest();
  2. function serialize(form) {
  3. var parts = [],
  4. field = null,
  5. i,
  6. len,
  7. j,
  8. optLen,
  9. option,
  10. optValue;
  11. for (i = 0, len = form.elements.length; i < len; i++) {
  12. field = form.elements[i];
  13. switch (field.type) {
  14. case 'select-one':
  15. case 'select-multiple':
  16. if (field.name.length) {
  17. for (j = 0, optLen = field.options.length; j < optLen; j++) {
  18. option = field.options[j];
  19. if (option.selected) {
  20. optValue = '';
  21. if (option.hasAttribute) {
  22. optValue = (option.hasAttribute('value') ?
  23. option.value : option.text);
  24. } else {
  25. optValue = (option.attributes['value'].specified ?
  26. option.value : option.text);
  27. }
  28. parts.push(encodeURIComponent(field.name) + '=' +
  29. encodeURIComponent(optValue));
  30. }
  31. }
  32. }
  33. break;
  34. case undefined:
  35. case 'file':
  36. case 'submit':
  37. case 'reset':
  38. case 'button':
  39. break;
  40. case 'radio':
  41. case 'checkbox':
  42. if (field.checked) {
  43. break;
  44. }
  45. default:
  46. if (field.name.length) {
  47. parts.push(encodeURIComponent(field.name) + '=' +
  48. encodeURIComponent(field.value));
  49. }
  50. }
  51. }
  52. return parts.join('&');
  53. }
  54. xhr.onreadystatechange = function() {
  55. if (xhr.readyState === 4) {
  56. if (xhr.status === 200) {
  57. document.querySelector('.content').innerHTML = xhr.responseText;
  58. } else {
  59. console.error(xhr.statusText);
  60. }
  61. }
  62. };
  63. xhr.onerror = function (e) {
  64. console.error(xhr.statusText);
  65. };
  66. var url = 'server.php';
  67. xhr.open('POST', url);
  68. xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  69. xhr.send(serialize(document.getElementById('postForm')));

PHP 处理脚本:

  1. if (isset($_POST["foo"]) && isset($_POST["lorem"])) {
  2. echo "POST: foo=" . $_POST["foo"] . "&lorem=" . $_POST["lorem"];
  3. }

六、FormData 类型

FormData 类型可以用于构造表单数据。

  1. var formData = new FormData();
  2. formData.append('username', '张三');
  3. formData.append('email', 'zhangsan@example.com');
  4. formData.append('birthDate', 1940);
  5. var xhr = new XMLHttpRequest();
  6. xhr.onreadystatechange = function(){
  7. if (xhr.readyState === 4) {
  8. if (xhr.status === 200) {
  9. document.querySelector('.content').innerHTML = xhr.responseText;
  10. } else {
  11. console.error(xhr.statusText);
  12. }
  13. }
  14. };
  15. xhr.open("POST", "server.php");
  16. xhr.send(formData);

PHP 处理脚本:

  1. if (isset($_POST["username"]) && isset($_POST["email"]) && isset($_POST["birthDate"])) {
  2. echo "POST: username=" . $_POST["username"] . "&email=" . $_POST["email"] . "&birthDate=" . $_POST["birthDate"];
  3. }

七、上传文件

HTML 代码:

  1. <form action="uploadFiles.php" method="post" enctype="multipart/form-data">
  2. <label for="file">文件名:</label>
  3. <input type="file" name="images[]" multiple>
  4. </form><hr>
  5. <div class="content"></div>

JavaScript 代码:

  1. function uploadFiles(url, files) {
  2. var formData = new FormData();
  3. for (var i = 0, file; file = files[i]; ++i) {
  4. formData.append('images[]', file); // 有可选的第三个参数,指定上传文件的文件名
  5. }
  6. var xhr = new XMLHttpRequest();
  7. xhr.open('POST', url, true);
  8. xhr.onload = function(e) {
  9. document.querySelector('.content').innerHTML = xhr.responseText;
  10. };
  11. xhr.send(formData);
  12. }
  13. document.querySelector('input[type="file"]').addEventListener('change', function(e) {
  14. uploadFiles('../asset/source/uploadFiles.php', this.files);
  15. }, false);

PHP 服务器处理脚本(在与脚本同级的目录下,新建文件夹 uploads,作为保存上传文件的地方):

  1. for($i = 0; $i< count($_FILES['images']['name']); $i++) {
  2. if ($_FILES['images']["error"][$i] > 0) {
  3. switch($_FILES['images']["error"][$i]) {
  4. case 1:
  5. $err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
  6. break;
  7. case 2:
  8. $err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
  9. break;
  10. case 3:
  11. $err_info="文件只有部分被上传";
  12. break;
  13. case 4:
  14. $err_info="没有文件被上传";
  15. break;
  16. case 6:
  17. $err_info="找不到临时文件夹";
  18. break;
  19. case 7:
  20. $err_info="文件写入失败";
  21. break;
  22. default:
  23. $err_info="未知的上传错误";
  24. break;
  25. }
  26. echo "错误:" . $err_info . "<hr>";
  27. continue;
  28. }
  29. echo "上传文件名: " . $_FILES['images']["name"][$i] . "<br>";
  30. echo "文件类型: " . $_FILES['images']["type"][$i] . "<br>";
  31. echo "文件大小: " . ($_FILES['images']["size"][$i] / 1024) . " kB<br>";
  32. echo "文件临时存储的位置: " . $_FILES['images']["tmp_name"][$i];
  33. echo "<hr>";
  34. $tmpFilePath = $_FILES['images']['tmp_name'][$i];
  35. if ($tmpFilePath != "") {
  36. $newFilePath = "./uploads/" . $_FILES['images']['name'][$i];
  37. move_uploaded_file($tmpFilePath, $newFilePath);
  38. }
  39. }

(完)

XMLHttpRequest API 使用指南的更多相关文章

  1. Web API 入门指南 - 闲话安全

    Web API入门指南有些朋友回复问了些安全方面的问题,安全方面可以写的东西实在太多了,这里尽量围绕着Web API的安全性来展开,介绍一些安全的基本概念,常见安全隐患.相关的防御技巧以及Web AP ...

  2. RESTful API 设计指南 (转)

    RESTful API 设计指南 2016-02-23 ImportNew (点击上方公号,可快速关注) 作者:阮一峰 链接:http://www.ruanyifeng.com/blog/2014/0 ...

  3. RESTFUL API 安全设计指南

    RESTFUL API 安全设计指南 xxlegend · 2015/10/18 15:08 0x01 REST API 简介 REST的全称是REpresentational State Trans ...

  4. 来自HeroKu的HTTP API 设计指南(中文版)

    原文转自:http://get.jobdeer.com/343.get 来自HeroKu的HTTP API 设计指南(中文版) 翻译 by @Easy 简介 本指南中文翻译者为 @Easy ,他是国内 ...

  5. Web API入门指南(安全)转

    安全检测的工具站点:https://www.owasp.org/index.php/Category:Vulnerability_Scanning_Tools Web API入门指南有些朋友回复问了些 ...

  6. 组件接口(API)设计指南-文件夹

    组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...

  7. Web API 入门指南

    Web API 入门指南 - 闲话安全2013-09-21 18:56 by 微软互联网开发支持, 231 阅读, 3 评论, 收藏, 编辑 Web API入门指南有些朋友回复问了些安全方面的问题,安 ...

  8. RESTFul API设计指南及使用说明

    RESTFul API设计指南及使用说明 一. 协议 API与用户的通信协议,使用HTTP协议. 二. 域名 应尽量将API部署在专用域名之下(http://api.example.com) 也可以将 ...

  9. Google API Design Guide (谷歌API设计指南)中文版

    面向资源的设计 这份设计指南的目标是帮助开发人员设计简单.一致.易用的网络API.同时,它也有助于收敛基于socket的API和(注:原文是with,这里翻译为“和”)基于HTTP的REST API. ...

随机推荐

  1. Linux系统(五)负载均衡LVS集群之DR模式

    序言 DR模式是lvs集群中三种负载均衡模式的其中一种,那么上一篇中我写啦关于NAT模式的搭建与原理,为什么还要有DR模式与IP隧道模式呢? 首先我们来看3张图.LVS/NAT模式如下图: LVS/I ...

  2. 【转】简单的java缓存实现

    本文转自 http://my.oschina.net/u/866190/blog/188712 提到缓存,不得不提就是缓存算法(淘汰算法),常见算法有LRU.LFU和FIFO等算法,每种算法各有各的优 ...

  3. Maven 搭建SpringMvc+Spring+Mybatis详细记录

    总觉得,看比人写的总是那么好,每次搭建框架时都会找博客,找教程来跟着一步一步走,虽然很快搭建成功了,但是经常情况是我并不知道我干了什么,也不记得具体步骤,到底为什么要这么做,今天我详细记录了一下自己搭 ...

  4. [C#7] 1.Tuples(元组)

    1. 老版本代码 class Program { static void Main(string[] args) { var fullName = GetFullName(); Console.Wri ...

  5. Java并发之需要了解但不能太依赖的东东

    <Java 编程思想>在并发一章中提到了Sleep休眠.优先级.后台线程,提醒读者需要了解但又不能太依赖他们.就让我们一起看看吧. 休眠Sleep import java.util.con ...

  6. Eclipse插件的各种安装方法

    这篇文章我们总结下安装Eclipse的各种方法,首先一下的步骤都是在版本为“Kepler Service Release 1”的Eclipse下完成的.如果你的Eclipse版本不是"Kep ...

  7. 基于vue的多引擎搜索及关键字提示

    关键代码: <div class="header-search"> <form id="form" action="http://m ...

  8. 008 Java集合浅析3

    在前面的几节里,本教程从整体架构上去把握了JDK中的集合框架,并简单分析了其中Collection组的顶级接口,知道Collection接口的常见直接子接口有List.Set和Queue,并就这三个子 ...

  9. 重回博客 谈一谈Node中的异步和单线程

    重回博客,这个帐号之前注册后就只发了一篇博客.听朋友建议,决定一周两次更新. 第一篇谈论一下最近想的比较多的异步的问题. 传统多线程异步 传统的异步是多线程的,当要同时做两件事的时候,他们是执行在不同 ...

  10. iOS UI控件总结(全)

    1.UIButton UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake ...