一、实例化 XMLHttpRequest 对象

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

var xhr = new XMLHttpRequest();

二、初始化请求

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

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

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

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

三、发送请求

xhr.send(null);

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

四、GET 请求

HTML 代码:

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

JavaScript 脚本:

var xhr = new XMLHttpRequest();

function addURLParam(url, name, value) {
url += (url.indexOf('?') == -1 ? '?' : '&');
url += encodeURIComponent(name) + '=' + encodeURIComponent(value);
return url;
} xhr.onreadystatechange = function(){
if (xhr.readyState === 4) {
if (xhr.status === 200) {
document.querySelector('.content').innerHTML = xhr.responseText;
} else {
console.error(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
}; var url = 'server.php';
url = addURLParam(url, 'author', '张宝');
url = addURLParam(url, 'article', 'XMLHttpRequest API 使用指南'); xhr.open('GET', url, true);
xhr.send(null);

PHP 处理脚本:

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

五、POST 请求

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

5.1 使用序列化数据

HTML 代码:

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

JavaScript 脚本:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function(){
if (xhr.readyState === 4) {
if (xhr.status === 200) {
document.querySelector('.content').innerHTML = xhr.responseText;
} else {
console.error(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
}; var url = '../asset/source/server.php'; xhr.open('POST', url);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("foo=bar&lorem=ipsum");

PHP 处理脚本:

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

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

HTML 代码:

<div class="content">
<form id="postForm">
<input type="text" value="bar" name="foo"><input type="text" value="ipsum" name="lorem">
</form>
</div>

JavaScript 脚本:

var xhr = new XMLHttpRequest();

function serialize(form) {
var parts = [],
field = null,
i,
len,
j,
optLen,
option,
optValue; for (i = 0, len = form.elements.length; i < len; i++) {
field = form.elements[i]; switch (field.type) {
case 'select-one':
case 'select-multiple': if (field.name.length) {
for (j = 0, optLen = field.options.length; j < optLen; j++) {
option = field.options[j];
if (option.selected) {
optValue = '';
if (option.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('&');
} xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
document.querySelector('.content').innerHTML = xhr.responseText;
} else {
console.error(xhr.statusText);
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
}; var url = 'server.php'; xhr.open('POST', url);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(serialize(document.getElementById('postForm')));

PHP 处理脚本:

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

六、FormData 类型

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

var formData = new FormData();

formData.append('username', '张三');
formData.append('email', 'zhangsan@example.com');
formData.append('birthDate', 1940); var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function(){
if (xhr.readyState === 4) {
if (xhr.status === 200) {
document.querySelector('.content').innerHTML = xhr.responseText;
} else {
console.error(xhr.statusText);
}
}
}; xhr.open("POST", "server.php");
xhr.send(formData);

PHP 处理脚本:

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

七、上传文件

HTML 代码:

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

JavaScript 代码:

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

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

for($i = 0; $i< count($_FILES['images']['name']); $i++) {

    if ($_FILES['images']["error"][$i] > 0) {
switch($_FILES['images']["error"][$i]) {
case 1:
$err_info="上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值";
break;
case 2:
$err_info="上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值";
break;
case 3:
$err_info="文件只有部分被上传";
break;
case 4:
$err_info="没有文件被上传";
break;
case 6:
$err_info="找不到临时文件夹";
break;
case 7:
$err_info="文件写入失败";
break;
default:
$err_info="未知的上传错误";
break;
} echo "错误:" . $err_info . "<hr>";
continue;
} echo "上传文件名: " . $_FILES['images']["name"][$i] . "<br>";
echo "文件类型: " . $_FILES['images']["type"][$i] . "<br>";
echo "文件大小: " . ($_FILES['images']["size"][$i] / 1024) . " kB<br>";
echo "文件临时存储的位置: " . $_FILES['images']["tmp_name"][$i];
echo "<hr>"; $tmpFilePath = $_FILES['images']['tmp_name'][$i];
if ($tmpFilePath != "") {
$newFilePath = "./uploads/" . $_FILES['images']['name'][$i];
move_uploaded_file($tmpFilePath, $newFilePath);
}
}

(完)

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. iOS仿微博客户端一条微博的布局

    前言 做一个微博客户端的第三方是自学的第一个实践的项目,自从从事iOS工作之后,就把这个项目给搁置了.趁现在过年回来有些空闲时间,再次修改(总觉得项目就是不停地修改).并且记录一点东西,以后可再回头看 ...

  2. Java虚拟机学习 - 垃圾收集器

    HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. Serial(串行GC)收集器 Serial收集 ...

  3. AR入门系列-在vuforia官网的使用-01-史上最详细AR入门教程

    使用高通的vuforiaSDK 网址:https://developer.vuforia.com/ 我们想要使用vuforia首先得注册一个账号 网站会发送邮件给你的邮箱 点击验证链接,验证邮箱 出现 ...

  4. HTML中鼠标移动过去变换

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. iOS性能检测之Instrunments - 几种常用工具简单介绍

    Instrunments:  没错,就是这货,很多人平时开发可能不一定会用到这个,但我要说的是,学会使用它,会让你加分不少哦 先来一张全家福: 1.打开方式 或者 两种方式都行. 2.今天主要介绍一下 ...

  6. python服务器环境搭建(1)——本地服务器准备

    去年十月底到新公司上班,由于公司旧系统存在各种问题同时不便于扩展,而公司领导对17年寄予很大的期望,用户量.收入要上一个新台阶,我经过全面评估后,决定全部用python重构过,开发一个基于微服务架构的 ...

  7. Windows下GIT安装与使用(上传远程端)

    Windows下GIT安装与使用(上传远程服务器) 1.  登陆http://msysgit.github.io/并下载Git 2.  打开下载的exe文件,一路默认(路径可以去修改).有可能电脑需要 ...

  8. IIS HTTP 错误 500.19 - Internal Server Error HTTP 错误 401.3 - Unauthorized 解决办法

    前言:IIS是一个强大的服务器管理器,当遇到 IIS HTTP 错误 500.19 - Internal Server Error  HTTP 错误 401.3 - Unauthorized 的解决办 ...

  9. django进阶-3

    先看效果图: 登陆admin后的界面: 查看作者: 当然你也可以定制admin, 使界面更牛逼 数据库表结构: app01/models.py from django.db import models ...

  10. 开启SQL Server执行占用时间显示和逻辑读取次数显示

    两条命令 1:set statistics time on 这条命令会显示你编译这条语句和执行这条语句花多长时间 2.set statistics io on 这条命令会显示你逻辑读取了多少次数据库和 ...