Ajax 学习笔记

4,477 阅读8分钟

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语句以分号结尾(;)

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




    
    Title


//查询表单

员工查询

请输入员工编号: 查询

//添加员工的表单

员工添加

请输入员工编号: 请输入员工姓名: 请选择员工性别: 男 女 请输入员工职位: 保存

Server.php文件:

 "洪七", "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”;//表示请求的返回信息; }

例子代码修改:

客户端代码:




    
    Title


员工查询

请输入员工编号: 查询

员工添加

请输入员工编号: 请输入员工姓名: 请选择员工性别: 男 女 请输入员工职位: 保存

服务器端server.php修改:

 "洪七", "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改写例子:




    
    Title


员工查询

请输入员工编号: 查询

员工添加

请输入员工编号: 请输入员工姓名: 请选择员工性别: 男 女 请输入员工职位: 保存

跨域

◎一个域名地址的组成:

当协议、子域名、主域名、端口号中的任意一个不相同时,都算作不同域。 ◎不同域之间相互请求资源,就算做跨域,比如:www.abc.com/index/html请… ◎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调用www.abc.com/service.php… ●www.abc.com/index/html调用www.abc.com:81/service.php(端口号不同,跨域)

处理跨域的方法:

用jsonp处理跨域:

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

修改例子:




    
    Title


员工查询

请输入员工编号: 查询

员工添加

请输入员工编号: 请输入员工姓名: 请选择员工性别: 男 女 请输入员工职位: 保存

服务器端代码server.php:

 "洪七", "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: ");//*代表所有域都可以访问,也可以设置一个特定的域名; header("Access-Control-Allow-Methods:POST,GET");

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