Ajax学习笔记

Ajax

什么是ajax

AJAX即“Asynchronous JavaScript and XML”(异步的JavaScript与XML技术),指的是一套综合了多项技术的浏览器端网页开发技术。
以前,几乎所有的网站都由HTML页面实现,服务器处理每一个用户请求都需要重新加载网页。这样的处理方式效率不高。用户的体验是所有页面都会消失,再重新载入,即使只是一部分页面元素改变也要重新载入整个页面,不仅要刷新改变的部分,连没有变化的部分也要刷新。这会加重服务器的负担。
这可以用异步加载来解决。ajax实现了局部刷新页面。

在了解ajax怎么使用之前,应该先了解XMLHttpRequest对象。

XMLHttpRequest对象

声明一个XMLHttpRequest对象:

var request =new XMLHttpRequest();(IE5和IE6不支持这种声明)
兼容IE5和IE6的声明:
var request;
if(window.XMLHttpRequest){
Request=new XMLHttpRequest();//IE7+,和chrome,Firefox等浏览器;}
else{
request=new ActiveXObject(“Microsoft.XMLHTTP”);//IE5,IE6
}

Http

◎Http:

◆一套计算机通过网络进行通信的规则;
◆一种无状态协议(无状态协议:不保留持久的连接);
◆使客户(浏览器)能够向web服务器请求信息和服务。

◎HTTP请求:

●步骤:1.建立TCP连接;
2.Web浏览器向Web服务器发送请求命令;
3.Web浏览器发送请求头信息;
4.Web服务器应答;
5.Web服务器发送应答头信息;
6.Web服务器向浏览器发送数据;
7.Web服务器关闭TCP连接。
●HTTP请求一般由四部分组成:
1.HTTP请求的方法或动作,比如是get还是post请求;
2.正在请求的URL(请求的地址);
3.请求头,包含一些客户端环境信息、身份验证信息等;
4.请求体(请求正文),可以包含客户提交的查询字符串信息、表单信息等。

●GET:一般用于信息获取(常用于查询);使用URL传递参数(变量显示在URL中,所有人可见);对所发送信息的数量有限制(一般在2000个字符)。
POST:一般用于修改服务器上的资源;对所发送的信息数量无限制。(不在URL中显示,对其他人不可见,信息在请求体中)(常用于发送表单数据,新建、修改等)。

◎HTTP响应:

一般由三部分组成:
1.一个数字和文字组成的状态码,用来显示请求是成功还是失败;
2.响应头,响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等;
3.响应体(响应正文)。

XMLHttpRequest发送请求

open(method,url,asyn) //(请求方法GET/POST,请求地址,同步(false)/异步(true,默认为true,可不写));
send(string) //(将请求发送到服务器,GET请求参数在URL中,所以参数string可写none,也可不写;POST时参数string要写)

XMLHTTPRequest取得响应:
responseText:获得字符串形式的响应数据;
responseXML:获得XML形式的响应数据;
status和statusTest:以数字和文本的形式返回HTTP状态码;
getAllResponseHeader():获取所有的响应报头;
getResponseHeader():查询响应中的某个字段的值;
readyState属性:这个属性的变化代表了服务器的响应的变化。
0:请求未初始化,open还没有调用;
1:服务器连接已建立,open已经调用;
2:请求已接受,也就是接收到头信息了;
3:请求处理中,也就是接收到响应主体了;
4: 请求已完成,且响应已就绪,也就是响应完成了。
eg:var request=new XMLHttpRequest();
request.open(“GET”,“get.php”,true);
request.send();
request.onreadystatechange=function(){
if(request.readyState===4&&request.status===200){
//做一些事情 request.responseText
}
}

php

◎php:是一种创建动态交互性站点的服务器端脚本语言;
(服务器端脚本语言?HTML和js是客户端语言,用于实现页面呈现、特效;服务器端脚本语言:用于从服务器端的存取)
◎PHP:(兼容几乎所有web服务器,支持几乎所有数据库)
◆能够生成动态页面内容;
◆能够创建、打开、读取、写入、删除以及关闭服务器上的文件;
◆能够接收表单数据;
◆能够发送并取回cookies;
◆能够添加、删除、修改数据库中的数据;
◆能够限制用户访问网站中的某些页面等。

PHP测试页面

● Php脚本以<?Php开头,以?>结尾
● Php文件的默认文件扩展名是.php
● Php语句以分号结尾(;)

例子(员工查询和添加):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
//查询表单
<h1>员工查询</h1>
<label>请输入员工编号:</label>
<input type="text" id="keyword"/>
<button id="search">查询</button>
<p id="searchResult"></p>
//添加员工的表单
<h1>员工添加</h1>
<label>请输入员工编号:</label>
<input type="text" id="staffnumber"/>
<label>请输入员工姓名:</label>
<input type="text" id="staffname" />
<label>请选择员工性别:</label>
<select id="staffsex">
    <option>男</option>
    <option>女</option>
</select>
<label>请输入员工职位:</label>
<input type="text" id="staffjob" />
<button id="save">保存</button>
<p id="createResult"></p>

<script type="text/javascript">
//为“查询”按钮添加点击事件:点击时查询相关员工:
    document.getElementById("search").onclick=function(){
        var request=new XMLHttpRequest();//生成XHR对象;
        request.open("GET","server.php?number="+document.getElementById("keyword").value);//XHR对象的open方法:请求方法:get;请求地址:server.php,参数为输入的编号;
        request.send();//发送请求
//监听request的状态的改变:readyState的改变:
        request.onreadystatechange=function () {
            if(request.readyState==4){//如果readyState为4即服务器响应已完成;
                if(request.status===200){
                //如果request的状态码为200;
document.getElementById("searchResult").innerHTML=request.responseText;//将查询结果显示;
                }
                else{
                    alert("发生错误"+request.status);
                }
            }
        }
    }
//为“保存”按钮添加点击事件:点击时添加相关员工:
document.getElementById("save").onclick=function(){
    var add_staff=new XMLHttpRequest();//生成XHR对象;
        add_staff.open("POST","server.php");//XHR对象的open方法:请求方法:post;请求地址:server.php;
        var data="number="+document.getElementById("staffnumber").value+"&name="+document.getElementById("staffname").value+"&sex="+document.getElementById("staffsex").value+"&job="+document.getElementById("staffjob").value;//将填写的数据保存到data;     add_staff.setRequestHeader("Content-Type","application/x-www-form-urlencoded");//设置请求头的content-type为获取表单信息;
        add_staff.send(data);//发送请求,post的参数为data;
//监听add_staff的状态的改变:readyState的改变:
        add_staff.onreadystatechange=function () {
            if(add_staff.readyState==4){/如果readyState为4即服务器响应已完成;
 if(add_staff.status===200){如果request的状态码为200;
//将响应内容显示出来:  document.getElementById("createResult").innerHTML=add_staff.responseText;
                }
                else{
                    alert("发生错误"+add_staff.status);
                }
            }
        }
    }
</script>
</body>
</html>

Server.php文件:

<?php
//设置页面内容是html编码格式是utf-8
header("Content-Type: text/plain;charset=utf-8"); 
//header("Content-Type: application/json;charset=utf-8"); 
//header("Content-Type: text/xml;charset=utf-8"); 
//header("Content-Type: text/html;charset=utf-8"); 
//header("Content-Type: application/javascript;charset=utf-8"); 

//定义一个多维数组,包含员工的信息,每条员工信息为一个数组
$staff = array
    (
        array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"),
        array("name" => "郭靖", "number" => "102", "sex" => "男", "job" => "开发工程师"),
        array("name" => "黄蓉", "number" => "103", "sex" => "女", "job" => "产品经理")
    );

//判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
//$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
//$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
if ($_SERVER["REQUEST_METHOD"] == "GET") {
    search();
} elseif ($_SERVER["REQUEST_METHOD"] == "POST"){
    create();
}

//通过员工编号搜索员工
function search(){
    //检查是否有员工编号的参数
    //isset检测变量是否设置;empty判断值为否为空
    //超全局变量 $_GET 和 $_POST 用于收集表单数据
    if (!isset($_GET["number"]) || empty($_GET["number"])) {
        echo "参数错误";
        return;
    }
    //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    //global 关键词用于访问函数内的全局变量
    global $staff;
    //获取number参数
    $number = $_GET["number"];
    $result = "没有找到员工。";
    
    //遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    foreach ($staff as $value) {
        if ($value["number"] == $number) {
            $result = "找到员工:员工编号:" . $value["number"] . ",员工姓名:" . $value["name"] . 
                              ",员工性别:" . $value["sex"] . ",员工职位:" . $value["job"];
            break;
        }
    }
    echo $result;
}

//创建员工
function create(){
    parse_str(file_get_contents('php://input'), $_POST);//解决post拿不到内容;
    //判断信息是否填写完全
    if (!isset($_POST["name"]) || empty($_POST["name"])
        || !isset($_POST["number"]) || empty($_POST["number"])
        || !isset($_POST["sex"]) || empty($_POST["sex"])
        || !isset($_POST["job"]) || empty($_POST["job"])) {
        echo "参数错误,员工信息填写不全";
        return;
    }
    //TODO: 获取POST表单数据并保存到数据库
    
    //提示保存成功
    echo "员工:" . $_POST["name"] . " 信息保存成功!";
}

json

◎JSON:javascript对象表示法;
◎JSON是存储和交换文本信息的语法,类似XML。它采用键值对的方式来组织,易于人们阅读和编写,同时也易于机器解析和生成。
◎JSON是独立于语言的,也就是说不管什么语言,都可以解析JSON,只需要按照JSON的规则来就行。

●JSON的长度和xml格式比起来很短小;
●JSON的读写速度更快;
●JSON可以使用javascript内建的方法直接进行解析,转换成javascript对象,非常方便。

Json语法规则

Json数据的书写格式是:名称/值对,eg:“name”:“大猪”。
●Json的值可以是下面这些类型:
◆数字(整数或浮点数),eg:123,1.23;
◆字符串(在双引号中);
◆逻辑值(true或false);
◆数组(在方括号中);
◆对象(在花括号中);
◆Null;

Eg:
{//大括号括起来表示一个json对象;
“staff”:[
{“name”: “洪七”, “age”:70},
{“name”: “郭靖”, “age”:35},
{“name”: “黄蓉”, “age”:30}
]
}

Json解析

◎Eval和JSON.parse:

Tip:在代码中使用eval是很危险的!特别是用它执行第三方的json数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身方法还可以捕捉json中的语法错误.
Eg:
●使用eval:
var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
var jsonobj=eval('('+jsondata+')');
alert(jsonobj.staff[0].name);
结果:弹出 “洪七”;
●使用JSON.parse():
var jsondata='{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
var jsonobj=JSON.parse(jsondata);
alert(jsonobj.staff[0].name);
结果:弹出 “洪七”;
■如果代码中出现错误:
●使用eval时,无法检验代码中的错误,例如例子中的alert,eval方法不会检查出这个错误,于是弹出 “123”,再弹出 “洪七”.
var jsondata='{"staff":[{"name":"洪七","age":alert(123)},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
var jsonobj=eval('('+jsondata+')');
alert(jsonobj.staff[0].name);
●使用JSON.parse()方法时会检查出alert这个错误,出现VM530:1 Uncaught SyntaxError: Unexpected token a in JSON at position 29(…),不会弹出任何信息.
Var jsondata='{"staff":[{"name":"洪七","age":alert(2)},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}';
var jsonobj=JSON.parse(jsondata);
alert(jsonobj.staff[0].name);

tip:☆Json格式化和校验:
在线校验工具:jsonlint.com

对上面的例子 “员工查询和添加”用json改写:
首先约定:
{
“success”:true;//表示请求是否成功;
“msg”: “xxx”;//表示请求的返回信息;
}

例子代码修改:

客户端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>员工查询</h1>
<label>请输入员工编号:</label>
<input type="text" id="keyword"/>
<button id="search">查询</button>
<p id="searchResult"></p>

<h1>员工添加</h1>
<label>请输入员工编号:</label>
<input type="text" id="staffnumber"/>
<label>请输入员工姓名:</label>
<input type="text" id="staffname" />
<label>请选择员工性别:</label>
<select id="staffsex">
    <option>男</option>
    <option>女</option>
</select>
<label>请输入员工职位:</label>
<input type="text" id="staffjob" />
<button id="save">保存</button>
<p id="createResult"></p>
<script type="text/javascript">
    document.getElementById("search").onclick=function(){
        var request=new XMLHttpRequest();
        request.open("GET","server.php?number="+document.getElementById("keyword").value);
        request.send();
        request.onreadystatechange=function () {
            if(request.readyState==4){
                if(request.status===200){
                    var data=JSON.parse(request.responseText);//解析服务器返回的信息;
                    if(data.success){
                        document.getElementById("searchResult").innerHTML=data.msg;
                    }
                    else {
                        document.getElementById("searchResult").innerHTML="出现错误:"+data.msg;
                    }
                }
                else{
                    alert("发生错误"+request.status);
                }
            }
        }
    }

    document.getElementById("save").onclick=function(){
        console.log('haha');
        var add_staff=new XMLHttpRequest();
        add_staff.open("POST","server.php");
        var data="number="+document.getElementById("staffnumber").value+"&name="+document.getElementById("staffname").value+"&sex="+document.getElementById("staffsex").value+"&job="+document.getElementById("staffjob").value;
add_staff.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        add_staff.send(data);
        add_staff.onreadystatechange=function () {
            if(add_staff.readyState==4){
                if(add_staff.status===200){
                    var data=JSON.parse(add_staff.responseText);
                    if(data.success){
                        document.getElementById("createResult").innerHTML=data.msg;
                    }
                    else {
      document.getElementById("createResult").innerHTML = "出现错误" + data.msg;
                    }
                }
                else{
                    alert("发生错误"+add_staff.status);
                }
            }
        }
    }
</script>
</body>
</html>

服务器端server.php修改:

<?php
//设置页面内容是html编码格式是utf-8
//header("Content-Type: text/plain;charset=utf-8");
header("Content-Type: application/json;charset=utf-8");
//header("Content-Type: text/xml;charset=utf-8"); 
//header("Content-Type: text/html;charset=utf-8"); 
//header("Content-Type: application/javascript;charset=utf-8"); 

//定义一个多维数组,包含员工的信息,每条员工信息为一个数组
$staff = array
    (
        array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"),
        array("name" => "郭靖", "number" => "102", "sex" => "男", "job" => "开发工程师"),
        array("name" => "黄蓉", "number" => "103", "sex" => "女", "job" => "产品经理")
    );

//判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
//$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
//$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
if ($_SERVER["REQUEST_METHOD"] == "GET") {
    search();
} elseif ($_SERVER["REQUEST_METHOD"] == "POST"){
    create();
}

//通过员工编号搜索员工
function search(){
    //检查是否有员工编号的参数
    //isset检测变量是否设置;empty判断值为否为空
    //超全局变量 $_GET 和 $_POST 用于收集表单数据
    if (!isset($_GET["number"]) || empty($_GET["number"])) {
        echo '{"success":false,"msg":"参数错误"}';
        return;
    }
    //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    //global 关键词用于访问函数内的全局变量
    global $staff;
    //获取number参数
    $number = $_GET["number"];
    $result = '{"success":false,"msg":"没有找到员工。"}';
    
    //遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    foreach ($staff as $value) {
        if ($value["number"] == $number) {
            $result = '{"success":true,"msg":"找到员工:员工编号:' . $value["number"] . ',员工姓名:' . $value["name"] .',员工性别:' . $value["sex"] . ',员工职位:' . $value["job"].'"}';
            break;
        }
    }
    echo $result;
}

//创建员工
function create(){
    parse_str(file_get_contents('php://input'), $_POST);
    //判断信息是否填写完全
    if (!isset($_POST["name"]) || empty($_POST["name"])
        || !isset($_POST["number"]) || empty($_POST["number"])
        || !isset($_POST["sex"]) || empty($_POST["sex"])
        || !isset($_POST["job"]) || empty($_POST["job"])) {
        echo '{"success":false,"msg":"参数错误,员工信息填写不全"}';
        return;
    }
    //TODO: 获取POST表单数据并保存到数据库
    
    //提示保存成功
    echo '{"success":true,"msg":"员工:' . $_POST["name"] . ' 信息保存成功!"}';
}

用jquery实现ajax

Jquery.ajax([settings])
●Type:类型, “POST”或者 “GET”,默认为 “GET”
●Url:发送请求地址;
●Data:是一个对象,连同请求发送到服务器的数据;
●dataType:预期服务器返回的数据类型.如果不指定,jquery将自动根据HTTP包MIME信息来智能判断,一般我们采用json格式,可以设置为 “json”.
●Success:是一个方法,请求成功后的回调函数.传入返回后的数据,以及包含成功代码的字符串.
●Error:是一个方法,请求失败时调用此函数,传入XMLHttpResult对象.
用jquery实现ajax改写例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>员工查询</h1>
<label>请输入员工编号:</label>
<input type="text" id="keyword"/>
<button id="search">查询</button>
<p id="searchResult"></p>

<h1>员工添加</h1>
<label>请输入员工编号:</label>
<input type="text" id="staffnumber"/>
<label>请输入员工姓名:</label>
<input type="text" id="staffname" />
<label>请选择员工性别:</label>
<select id="staffsex">
    <option>男</option>
    <option>女</option>
</select>
<label>请输入员工职位:</label>
<input type="text" id="staffjob" />
<button id="save">保存</button>
<p id="createResult"></p>

<script src="jquery-3.1.0.min.js"></script>
<script>
    $(document).ready(function () {
        $("#search").click(function () {
            $.ajax({
                type:"GET",
                url:"server.php?number="+$("#keyword").val(),
                dataType:"json",
                success:function (data) {
                    if(data.success){
                        $("#searchResult").html(data.msg);
                    }
                    else {
                        $("#searchResult").html("出现错误:"+data.msg);
                    }
                },
                error:function (jqXHR) {
                    alert("发生错误"+jqXHR.status);
                }
            });
        });

        $("#save").click(function () {
            $.ajax({
                type:"POST",
                url:"server.php",
                dataType:"json",
                data:{
                    name:$("#staffname").val(),
                    number:$("#staffnumber").val(),
                    sex:$("#staffsex").val(),
                    job:$("#staffjob").val()
                },
                success:function (data) {
                    if(data.success){
                        $("#createResult").html(data.msg);
                    }
                    else {
                        $("#createResult").html("出现错误:"+data.msg);
                    }
                },
                error:function (jqXHR) {
                    alert("发生错误"+jqXHR.status);
                }
            });
        });

    });
    /*document.getElementById("search").onclick=function(){
        var request=new XMLHttpRequest();
        request.open("GET","server.php?number="+document.getElementById("keyword").value);
        request.send();
        request.onreadystatechange=function () {
            if(request.readyState==4){
                if(request.status===200){
                    var data=JSON.parse(request.responseText);
                    if(data.success){
                        document.getElementById("searchResult").innerHTML=data.msg;
                    }
                    else {
                        document.getElementById("searchResult").innerHTML="出现错误:"+data.msg;
                    }
                }
                else{
                    alert("发生错误"+request.status);
                }
            }
        }
    }

    document.getElementById("save").onclick=function(){
        console.log('haha');
        var add_staff=new XMLHttpRequest();
        add_staff.open("POST","server.php");
        var data="number="+document.getElementById("staffnumber").value+"&name="+document.getElementById("staffname").value+"&sex="+document.getElementById("staffsex").value+"&job="+document.getElementById("staffjob").value;
        add_staff.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        add_staff.send(data);
        add_staff.onreadystatechange=function () {
            if(add_staff.readyState==4){
                if(add_staff.status===200){
                    var data=JSON.parse(add_staff.responseText);
                    if(data.success){
                        document.getElementById("createResult").innerHTML=data.msg;
                    }
                    else {
                        document.getElementById("createResult").innerHTML = "出现错误" + data.msg;
                    }
                }
                else{
                    alert("发生错误"+add_staff.status);
                }
            }
        }
    }*/
</script>
</body>
</html>

跨域

◎一个域名地址的组成:

当协议、子域名、主域名、端口号中的任意一个不相同时,都算作不同域。
◎不同域之间相互请求资源,就算做跨域,比如:http://www.abc.com/index/html请求http://www.efg.com/service.php
◎Javascript出于安全方面的考虑,不允许跨域调用其他页面的对象。
◎跨域就是因为javascript同源策略的限制,a.com域名下的js无法操作b.com或是c.a.com域名下的对象。
◎Javascript出于安全方面的考虑,不允许跨域调用其他页面的对象。
www.abc.com/index.html调用www.abc.com/service.php(没有写协议默认是http,所以协议、主域名、子域名和端口号都相同,非跨域)
www.abc.com/index.html调用www.efg.com/service.php(子域名不同,跨域)
www.abc.com/index.html调用bbs.abc.com/service.php(子域名不同,跨域)
www.abc.com/index.html调用https://www.abc.com/service.php(协议不同,一个是http,一个是https,跨域)
www.abc.com/index/html调用www.abc.com:81/service.php(端口号不同,跨域)

处理跨域的方法:

用jsonp处理跨域:

jsonp可用于解决主流浏览器的跨域数据访问的问题(即可以处理get不可以处理post)

修改例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>员工查询</h1>
<label>请输入员工编号:</label>
<input type="text" id="keyword"/>
<button id="search">查询</button>
<p id="searchResult"></p>

<h1>员工添加</h1>
<label>请输入员工编号:</label>
<input type="text" id="staffnumber"/>
<label>请输入员工姓名:</label>
<input type="text" id="staffname" />
<label>请选择员工性别:</label>
<select id="staffsex">
    <option>男</option>
    <option>女</option>
</select>
<label>请输入员工职位:</label>
<input type="text" id="staffjob" />
<button id="save">保存</button>
<p id="createResult"></p>

<script src="jquery-3.1.0.min.js"></script>
<script>
    $(document).ready(function () {
        $("#search").click(function () {
            $.ajax({
                type:"GET",
                url:"http://localhost:8080/try2/server.php?number="+$("#keyword").val(),//客户端请求的url地址属于跨域,端口号不同.
                dataType:"jsonp",//修改dataType为jsonp;
                jsonp:"callback",//添加jsonp属性为自定义的callback;
                success:function (data) {
                    if(data.success){
                        $("#searchResult").html(data.msg);
                    }
                    else {
                        $("#searchResult").html("出现错误:"+data.msg);
                    }
                },
                error:function (jqXHR) {
                    alert("发生错误"+jqXHR.status);
                }
            });
        });

        $("#save").click(function () {
            $.ajax({
                type:"POST",
                url:"server.php",
                dataType:"json",
                data:{
                    name:$("#staffname").val(),
                    number:$("#staffnumber").val(),
                    sex:$("#staffsex").val(),
                    job:$("#staffjob").val()
                },
                success:function (data) {
                    if(data.success){
                        $("#createResult").html(data.msg);
                    }
                    else {
                        $("#createResult").html("出现错误:"+data.msg);
                    }
                },
                error:function (jqXHR) {
                    alert("发生错误"+jqXHR.status);
                }
            });
        });

    });
    
</script>
</body>
</html>

服务器端代码server.php:

<?php
//设置页面内容是html编码格式是utf-8
//header("Content-Type: text/plain;charset=utf-8");
header("Content-Type: application/json;charset=utf-8");
//header("Content-Type: text/xml;charset=utf-8");
//header("Content-Type: text/html;charset=utf-8");
//header("Content-Type: application/javascript;charset=utf-8");

//定义一个多维数组,包含员工的信息,每条员工信息为一个数组
$staff = array
(
    array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"),
    array("name" => "郭靖", "number" => "102", "sex" => "男", "job" => "开发工程师"),
    array("name" => "黄蓉", "number" => "103", "sex" => "女", "job" => "产品经理")
);

//判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
//$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
//$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
if ($_SERVER["REQUEST_METHOD"] == "GET") {
    search();
} elseif ($_SERVER["REQUEST_METHOD"] == "POST"){
    create();
}

//通过员工编号搜索员工
function search(){
    $jsonp=$_GET["callback"];
    //检查是否有员工编号的参数
    //isset检测变量是否设置;empty判断值为否为空
    //超全局变量 $_GET 和 $_POST 用于收集表单数据
    if (!isset($_GET["number"]) || empty($_GET["number"])) {
        echo '{"success":false,"msg":"参数错误"}';
        return;
    }
    //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    //global 关键词用于访问函数内的全局变量
    global $staff;
    //获取number参数
    $number = $_GET["number"];
    $result = $jsonp.'({"success":false,"msg":"没有找到员工。"})';

    //遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    foreach ($staff as $value) {
        if ($value["number"] == $number) {
            $result = $jsonp.'({"success":true,"msg":"找到员工:员工编号:' . $value["number"] . ',员工姓名:' . $value["name"] .',员工性别:' . $value["sex"] . ',员工职位:' . $value["job"].'"})';
            break;
        }
    }
    echo $result;
}

//创建员工
function create(){
    parse_str(file_get_contents('php://input'), $_POST);
    //判断信息是否填写完全
    if (!isset($_POST["name"]) || empty($_POST["name"])
        || !isset($_POST["number"]) || empty($_POST["number"])
        || !isset($_POST["sex"]) || empty($_POST["sex"])
        || !isset($_POST["job"]) || empty($_POST["job"])) {
        echo '{"success":false,"msg":"参数错误,员工信息填写不全"}';
        return;
    }
    //TODO: 获取POST表单数据并保存到数据库

    //提示保存成功
    echo '{"success":true,"msg":"员工:' . $_POST["name"] . ' 信息保存成功!"}';
}

用XHR2处理跨域:

Html5提供的XMLHttpRequest Level2已经实现了跨域访问以及其他的一些新功能.
IE10以下的版本都不支持.
在服务器端做一些小的修改即可:
Header(‘Access-Control-Allow-Origin:’);
Header(‘Access-Control-Allow-Methods:POST,GET’);
Eg:
<?php
//设置页面内容是html编码格式是utf-8
//header("Content-Type: text/plain;charset=utf-8");
header("Content-Type: application/json;charset=utf-8");
header("Access-Control-Allow-Origin:
");//*代表所有域都可以访问,也可以设置一个特定的域名;
header("Access-Control-Allow-Methods:POST,GET");

——以上是我在慕课网上学习ajax的学习笔记。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容