ajax可以在本地使用,但是牵扯到不同源问题,需要跨域操作。下面是两个文件的代码,test.html放在桌面上,cors.php放在搭好的服务器上面,我这里配置的端口号是9096,端口号可以自行配置,默认的话是80端口,双击打开test.html文件,控制台会输出下面信息
{"code":200,"msg":"success"}
test.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
head>
<body>
<script src="http://www.jq22.com/jquery/jquery-1.10.2.js">script>
<script>
$.get("http://localhost:9096/testCode/cors/cors.php").done(function(data){
console.log(data)
})
script>
body>
html>
cors.php
header("access-control-allow-origin: *");
$result = array(
'code' => 200,
'msg' => 'success'
);
if($_GET['callback'])
echo ';'. $_GET['callback'] . '(' . json_encode($result) .')';
else
echo json_encode($result);
?>
对上面这些不懂得可以直接忽略,不影响下面学习,学习ajax最好在本地配置一个服务器,将代码放在服务器下面对应的文件夹中通过127.0.0.1或者localhost或者配置虚拟主机来访问。
最简单的办法是在网上下载一个集成的环境,我们以php语言和apache服务为例,比如集成环境phpstudy、wamp等,爱鼓捣的码友可以自己动手一步一步的配置。我本地使用的是phpstudy集成环境,安装使用都比较方便,也不大才35.6M。
温馨提示:看到这里的默认已经在本地搭建好服务器,并将端口号配置为9096,如果没有配置端口号将下面的9096替换为80或者省去即可。下面的代码均放在服务器下面通过127.0.0.1或者localhost或者配置虚拟主机来访问。
全称 Asynchronous JavaScript and XML (异步JavaScript和XML)
用JavaScript异步的形式去操作xml,它要完成的工作也就是数据交互。
数据交互也就是可以从某个地方拿取数据,也可以发送数据到某个地方。
一般情况下我们会使用ajax和后端(php、nodejs等)进行数据交互,我们会把数据发送给后端,后端接收到数据后做出一些操作后返回一些数据给我们,这就是数据交互,ajax做的就是这一块。
它有一个特点,就是体现在异步交互上面,可以节约用户时间,提高用户体验,减少数据请求等。
ajax可以在不刷新页面的情况下发送一个请求到某个地方获取一些数据。
例子:这里以一个静态文件作为例子,test.html与1.txt在同一级,都在服务器下面的www目录下,我们打开浏览器,访问localhost:9096/test.html,单击按钮将会请求同一目录下1.txt文件的内容,如果成功的话会弹出一个弹出框显示hello,ajax!。
test.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
<script>
window.onload = function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
//ajax的整个流程可以理解为浏览器操作,比如:
var xhr = new XMLHttpRequest();//可以想象为打开浏览器
xhr.open('get','1.txt',true);//在地址栏输入地址
xhr.send();//按下回车提交
//等待浏览器返回内容
xhr.onreadystatechange = function(){
if (xhr.readyState == 4) {//返回内容
if(xhr.status == 200){//200成功状态码
alert(xhr.responseText);
}else{
alert('出错了,Err:' + xhr.status );
}
}
}
}
}
script>
head>
<body>
<input type="button" value="按钮" id="btn">
body>
html>
1.txt
hello,ajax!
//方法一:
var xhr = null;
if(window.XMLHttpRequest{
xhr = new XMLHttpRequest();
}else{
xhr = new ActiceXObject('Microsoft.XMLHTTP');
}
//方法二:
var xhr = null;
try{
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiceXObject('Microsoft.XMLHttp');
}
open方法有三个参数
打开方式,也就是请求方式(get、post等,其他的可以在网上找一下)
请求地址
是否异步
setRequestHeader方法
send方法
xhr.open('get','get.php?username=zhou&age=21',true);
xhr.send('username=zhou&age=21');
onreadystatechange事件: (on readystate change)当readyState改变的时候触发
readyState : ajax工作状态
status : 服务器状态,http状态码
responseText : ajax请求返回的内容就被存放到这个属性下面
下面是一个例子,text.html和get.php在服务器下同一级
下面用到了PHP中的json_encode函数,和JS中的JSON.parse()方法,意义在于将这些数据统一转换为json格式。
text.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
<script>
window.onload = function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
//创建对象
var xhr = null;
try{
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiceXObject('Microsoft.XMLHttp');
}
xhr.open('get','get.php',true);
xhr.send();//发送请求
xhr.onreadystatechange = function(){
if (xhr.readyState == 4) {
if(xhr.status == 200){//成功
alert(JSON.parse(xhr.responseText));
}else{
alert('出错了,Err:'+xhr.status);
}
}
}
}
}
script>
head>
<body>
<input type="button" value="按钮" id="btn">
body>
html>
get.php
header('content-type:text/html;charset="utf-8"');
error_reporting(0);// 关闭错误报告
$arr = array('zhou','21','男');
echo json_encode($arr);
get请求有时可能会有缓存和乱码问题,在下面有相应解决方案
例子:
test.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
<script>
window.onload = function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
var xhr = null;
try{
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiceXObject('Microsoft.XMLHttp');
}
xhr.open('get','get.php?username=zhou&age=21',true);
xhr.send();
xhr.onreadystatechange = function(){
if (xhr.readyState == 4) {
if(xhr.status == 200){
alert(JSON.parse(xhr.responseText));
}else{
alert('出错了,Err:'+xhr.status);
}
}
}
}
}
script>
head>
<body>
<input type="button" value="按钮" id="btn">
body>
html>
get.php
'content-type:text/html;charset="utf-8"');
error_reporting(0);
$username = $_GET['username'];
$age = $_GET['age'];
echo json_encode("$username,$age");
get请求的响应默认是可以缓存的(响应应该包含一个到期时间, 或者有一个验证器),get请求被缓存,导致页面数据没有刷新,我们有时候需要针对缓存问题有一个解决方案:
xhr.open('get','get.php?username=zhou&age=21&'+new Date().getTime(),true);
xhr.open('get','get.php?username='+encodeURI('周')+'&age=21&'+new Date().getTime(),true);
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');//post必须要告诉后端发送的数据是什么类型的
xhr.send('username=zhou&age=21');
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
post请求的例子:
text.html
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Documenttitle>
<script>
window.onload = function(){
var oBtn = document.getElementById('btn');
oBtn.onclick = function(){
var xhr = null;
try{
xhr = new XMLHttpRequest();
}catch(e){
xhr = new ActiceXObject('Microsoft.XMLHttp');
}
xhr.open('post','post.php',true);
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');//post必须要告诉后端发送的数据是什么类型的
xhr.send('username=zhou&age=21');
xhr.onreadystatechange = function(){
if (xhr.readyState == 4) {
if(xhr.status == 200){
alert(JSON.parse(xhr.responseText));
}else{
alert('出错了,Err:'+xhr.status);
}
}
}
}
}
script>
head>
<body>
<input type="button" value="按钮" id="btn">
body>
html>
post.php
'content-type:text/html;charset="utf-8"');
error_reporting(0);
$username = $_POST['username'];
$age = $_POST['age'];
echo json_encode("$username,$age");