AJAX的基础使用与封装
学习笔记,请多指教
<a href="http://www.w3cschool.cn/ajax/ajax-tutorial.html">学习网址推荐</a>
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)
AJAX 可以使网页实现异步更新,创建快速动态网页(即下拉页面到底后立即刷新加载更多内容)
其实就类似于安卓的多进程和iOS的多线程啦
首先要练习AJAX的话,需要自己搭建一个服务器(具体如何搭建我这里就不花大量时间与篇幅写了,因为意义不大,纯粹练习而已,工作中会有专门的后台),并写一点服务器代码,我这里用的是一点php;
在你搭建好服务器之后,设置网站根目录,在目录中创建.php与.html文件即可;
如果是.html文件,服务器会直接渲染在浏览器,如果是.php文件,服务器会先执行完代码,将结果返回给浏览器
下面的demo是点击按钮从服务器请求不同图片与文字展示在两个div上
(images里有三张图片)
可以看出AJAX主要分五步
.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX基本使用</title>
</head>
<body>
<div class='pictureDiv'></div>
<div class='infoDiv'></div>
<input type="button" value='first' onclick='change(this.value)'>
<input type="button" value='second' onclick='change(this.value)'>
<input type="button" value='third' onclick='change(this.value)'>
</body>
<script type="text/javascript">
//按钮添加的点击事件
function change(name){
// 1.建立XMLHTTPRequest对象(核心js对象)
var ajax = new XMLHttpRequest();
// 2.规定请求的类型(get或者post),
// URL(本地即.php文件名,可以在?后加用=连接的参数key),
// 是否异步处理请求(true异步或 false同步,一般不填)
ajax.open('get','change.php?name='+name);
// *使用post*
// ajax.open('post','change.php');
// *使用post必须要设置请求报文,get不用*
// ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 3.发送请求(get请求没有参数)
ajax.send();
// *使用post发送请求可带参数key*
// ajax.send('name='+name);
// 4.每当 ajax对象的readyState 属性改变时,就会调用该函数,我们可以根据服务器响应状态来做事情
ajax.onreadystatechange = function () {
// 判断(状态为4时请求已完成,响应已就绪,200为连接成功)
if (ajax.readyState==4 && ajax.status==200)
{
// 5.响应成功,使用返回的数据 修改页面的内容
// responseText 返回的就是一个 字符串
// 我们 在ajax 中 如果 是通过 ajax.responseText 获取到的 统统都是字符串
console.log(ajax.responseText);
// 分割字符串,返回一个数组(这种加载.php中数据方式并不是在真正开发中使用的,后面会介绍加载XML与JSON方式)
var infoArr = ajax.responseText.split("|");
// 修改图片
document.querySelector('.pictureDiv').style.background ="url("+infoArr[0]+")";
// 修改文本
document.querySelector('.infoDiv').innerText =infoArr[1];
}
}
}
</script>
</html>
.php文件:
<?php
// 准备数据
$infoArray = array(
'first' =>'images/first.jpg|第一张图片' ,
'second' =>'images/second.jpg|第二张图片' ,
'third' =>'images/third.jpg|第三张图片'
);
// 通过$_GET[]获取 浏览器发送过来的key
// $_GET[]是php中的一个全局对象,用于收集来自 method="get"的表单中的值
$key = $_GET['name'];
//$key = $_POST['name'];
// 响应的数据
echo $infoArray[$key];
?>
下面的demo是点击按钮,从服务器的xml中读取图片名字,图片,文字展示成table
(images里有三张图片)
.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX使用之POST请求XML格式数据</title>
</head>
<body>
<input type="button" value="获取?" id='getPicture'>
</body>
</html>
<script type="text/javascript">
// 绑定点击事件
document.querySelector('#getPicture').onclick = function () {
var ajax = new XMLHttpRequest();
// post
ajax.open('post','change.php');
// 设置请求的报文 固定的
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 发送
ajax.send();
// 注册事件
ajax.onreadystatechange = function () {
if (ajax.readyState==4 && ajax.status==200)
{
// 知道返回的是 xml
console.log(ajax.responseXML);
// document对象,选择所有的picture标签
var pictures = ajax.responseXML.querySelectorAll('picture');
// 在循环之前把table拼出来
var str ='';
// <table>
str+='<table>';
// 循环 获取其中的某一个
for (var i = 0; i < pictures.length; i++) {
// 获取当前循环的那个picture标签对象
var currentPicture = pictures[i];
// 获取每一个值
console.log(currentPicture.querySelector('name').innerHTML);
console.log(currentPicture.querySelector('path').innerHTML);
console.log(currentPicture.querySelector('info').innerHTML);
// 方法1 创建一个 table
/* js创建dom元素 再添加 比较繁琐
document.createElement('table').appendChild();
document.createElement('tr');
document.createElement('td');
*/
// 方法2 直接拼接出一个table的字符串,然后设置到页面上即可
// 拼接开头
str+='<tr>';
// 拼接各表格
str+='<td>'+currentPicture.querySelector('name').innerHTML+'</td>';
// 添加图片
str+='<td>![]('+currentPicture.querySelector('path').innerHTML+')</td>';
str+='<td>'+currentPicture.querySelector('info').innerHTML+'</td>';
// 再次添加一个td
str+='<td><a href="#">点击了解更多_'+currentPicture.querySelector('name').innerHTML+'</a></td>';
// 拼接结尾
str+='</tr>';
}
// 循环完毕以后 将table合并
str+='</table>';
console.log(str);
// 直接 添加到页面上
document.body.innerHTML = str;
}
}
}
</script>
.php文件:
<?php
// 设置返回的是 xml
header('content-type:text/xml; charset= utf-8');
// 读取文件并返回
echo file_get_contents('info/change.xml');
?>
.xml文件:
XML指可扩展标记语言EXtensible Markup Language
<?xml version="1.0" encoding="UTF-8"?>
<testXML>
<picture>
<name>第一张图片</name>
<path>images/first.jpg</path>
<info>哈哈哈</info>
</picture>
<picture>
<name>第二张图片</name>
<path>images/second.jpg</path>
<info>嘿嘿嘿</info>
</picture>
<picture>
<name>第三张图片</name>
<path>images/third.jpg</path>
<info>啦啦啦</info>
</picture>
</testXML>
下面的demo是点击按钮,从服务器的json中读取图片名字,图片,文字展示成table
(images里有三张图片)
.html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>AJAX使用之POST请求JSON格式数据</title>
</head>
<body>
<input type="button" value="获取图片" id='getPicture'>
</body>
</html>
<script type="text/javascript">
document.querySelector("#getPicture").onclick = function () {
var ajax = new XMLHttpRequest();
ajax.open('post','change.php');
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.readyState==4&&ajax.status==200)
{
// json是字符串 所以我们可以通过responseText获取
console.log(ajax.responseText);
// 转化为js对象 不管是[]数组还是{}对象都可以使用该方法转化
var pictureArr = JSON.parse(ajax.responseText);
//也放到一个table中展示
var str ='';
// table 开始
str +='<table>';
// 拼接tr td
for (var i = 0; i < pictureArr.length; i++)
{
// 获取 当前循环的那个 对象
var currentPicture = pictureArr[i];
// 拼接到 tr
str+='<tr>';
str+='<td>'+currentPicture.name+'</td>';
str+='<td>'+currentPicture.info+'</td>';
str+='<td>![]('+currentPicture.path+')</td>';
str+='</tr>';
}
// table 结束
str +='</table>';
// 页面上显示
document.body.innerHTML = str;
}
}
}
</script>
.php文件:
<?php
// 读取并返回
echo file_get_contents('info/change.json');
?>
.json文件:
JSON(JavaScript Object Notation),是ECMAScript的子集,作用是进行数据的交换,而且由于语法更为简洁,网络传输,以及机器解析都更为迅速.
[
{
"name":"第一张图片",
"info":"哈哈哈",
"path":"images/first.jpg"
},
{
"name":"第二张图片",
"info":"啦啦啦",
"path":"images/second.jpg"
},
{
"name":"第三张图片",
"info":"嘿嘿嘿",
"path":"images/third.jpg"
}
]
封装在ajax.js中的AJAX请求工具
当然,封装请求工具的方式和思路有很多,这里只是基础地封装一下,最终应该根据具体项目情况操作
//1: ajax get
function ajax_get(url,data) {
var ajax = new XMLHttpRequest();
// 如果是get发送数据,这里需要拼接 url
if (data)
{
// 如果有值需要拼接字符串 格式为xxx.php?name=first&path=xxx/xxx
url+='?';
url+=data;
}
else
{
}
ajax.open('get',url);
ajax.send();
ajax.onreadystatechange = function () {
if (ajax.readyState==4&& ajax.status==200)
{
console.log(ajax.responseText);
}
}
}
//2: ajax post
function ajax_post(url,data) {
var ajax = new XMLHttpRequest();
ajax.open('post',url);
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
if (data)
{
// 如果有值 post是在send中发送给服务器
ajax.send(data);
}
else
{
ajax.send();
}
ajax.onreadystatechange = function () {
if (ajax.readyState==4&&ajax.status==200)
{
console.log(ajax.responseText);
}
}
}
//3: 将 get 跟post 封装到一起
/*
参数1:url
参数2:数据
参数3:请求的方法
参数4:数据成功获取以后 调用的方法
*/
function ajax_tool(url,data,method,success) {
// 异步对象
var ajax = new XMLHttpRequest();
// get 跟post 需要分别写不同的代码
if (method=='get')
{
// get请求
if (data)
{
// 如果有值
url+='?';
url+=data;
}
else
{
}
// 设置 方法 以及 url
ajax.open(method,url);
// send即可
ajax.send();
}
else
{
// post请求
// post请求 url 是不需要改变
ajax.open(method,url);
// 需要设置请求报文
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 判断data send发送数据
if (data)
{
// 如果有值 从send发送
ajax.send(data);
}
else
{
// 没有值 直接发送即可
ajax.send();
}
}
// 注册事件
ajax.onreadystatechange = function () {
// 在事件中 获取数据 并修改界面显示
if (ajax.readyState==4&&ajax.status==200) {
// console.log(ajax.responseText);
// 外面可以传入一个 function 作为参数 success
success(ajax.responseText);
}
}
}
//4: 将工具函数进行改造 只接收一个参数对象
/*
url:请求的url
data:发送的数据
method:请求的方法
success:请求成功以后 调用的函数
*/
function ajax_tool_pro(option) {
var ajax = new XMLHttpRequest();
if (option.method=='get')
{
// get请求
if (option.data)
{
// 如果有值
option.url+='?';
option.url+=option.data;
}
else
{
}
// 设置请求方法以及option.url
ajax.open(option.method,option.url);
ajax.send();
}
else
{
// post请求 option.url 是不需要改变
ajax.open(option.method,option.url);
ajax.setRequestHeader("Content-type","application/x-www-form-urlencoded");
// 判断option.data send发送数据
if (option.data)
{
// 如果有值 从send发送
ajax.send(option.data);
}
else
{
// 没有值 直接发送即可
ajax.send();
}
}
// 注册事件
ajax.onreadystatechange = function () {
// 在事件中 获取数据 并修改界面显示
if (ajax.readyState==4&&ajax.status==200) {
// console.log(ajax.responseText);
// 外面可以传入一个函数作为参数success
option.success(ajax.responseText);
}
}
}
两种工具的调用方式:
<script type="text/javascript" src='xxx/ajax.js'></script>
<script type="text/javascript">
document.querySelector("#ajaxTool").onclick = function () {
// 1:工具函数(接收4个参数的)
ajax_tool(url,data,method,success)
ajax_tool('xxx.php',undefined,'get',function(data){
console.log(data);
})
// 2:工具函数(接收1个对象参数的)
// 好处:参数的顺序可以任意的改变
ajax_tool_pro({
method:"get",
success:function(data){
console.log(data);
},
data:undefined,
url:"xxx.php"
})
}
</script>