浅谈AJAX

浅谈AJAX

一、AJAX概述

Ajax指异步 JavaScript 及 XML(AsynchronousJavaScript And XML.

Ajax的核心是JavaScript对象XmlHttpRequest。它是一种用于创建快速动态网页的技术,而不是一种语言。可以与服务器进行少量数据交换,使网页实现异步更新。简而言之,XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应,而不阻塞用户。

 

二、AJAX基本工作原理:

相当于在用户和服务器之间加一个中间层,异步请求不会阻塞客户端的操作,客户端通过浏览器的内置对象XMLHttpRequest来发送异步请求。

 

现在就来说下XHR的运用吧!

第一步:创建XHR对象,为了兼容低版本的IE浏览器,可以写成如下

 

第二步:发送请求

在讲XHR发送之前,先来补充下HTTP的请求和相应

一个完整的HTTP请求过程,一般有7步

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. 请求体,也就是请求正文,请求正文中可以包含客户提交的查询字符串信息,表单信息等等

 

图 2 :http请求的信息

 

 

http响应

http响应一般由三部分组成:

1.      一个数字和文字组成的状态码,用来显示请求是成功还是失败

2.      响应头,响应头也和请求头一样包含许多有用的信息,例如服务器类型、日期时间、内容类型和长度等

3.      响应体,也就是响应正文

 

图3 http响应

 

 

下面介绍XHR发动请求

 

XHR取得响应

 

 

现在说个例子

XMLHttpRequest.html

 

<!DOCTYPEHTML>

<html>

<head>

<metahttp-equiv="Content-Type" content="text/html;charset=utf-8">

<title>Demo</title>

<style>

body,input, select, button, h1 {

         font-size: 28px;

         line-height:1.7;

}

</style>  

</head>

 

<body>

 

<h1>员工查询</h1>

 

<label>请输入员工编号:</label>

<inputtype="text" id="keyword" />

<buttonid="search">查询</button>

<pid="searchResult"></p>

 

<h1>员工新建</h1>

<label>请输入员工姓名:</label>

<inputtype="text" id="staffName" /><br>

<label>请输入员工编号:</label>

<inputtype="text" id="staffNumber" /><br>

<label>请选择员工性别:</label>

<selectid="staffSex">

<option>女</option>

<option>男</option>

</select><br>

<label>请输入员工职位:</label>

<inputtype="text" id="staffJob" /><br>

<buttonid="save">保存</button>

<pid="createResult"></p>

 

<script>

document.getElementById("search").οnclick= 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) {

                                     document.getElementById("searchResult").innerHTML= request.responseText;

                            } else {

                                     alert("发生错误:" + request.status);

                            }

                   }

         }

}

 

document.getElementById("save").οnclick= function() {

         var request = new XMLHttpRequest();

         request.open("POST","server.php");

         var data = "name=" +document.getElementById("staffName").value

                           + "&number=" +document.getElementById("staffNumber").value

                           + "&sex=" + document.getElementById("staffSex").value

                           + "&job=" +document.getElementById("staffJob").value;

         request.setRequestHeader("Content-type","application/x-www-form-urlencoded");

         request.send(data);

         request.onreadystatechange = function(){

                   if (request.readyState===4) {

                            if(request.status===200) {

                                     document.getElementById("createResult").innerHTML= request.responseText;

                            } else {

                                     alert("发生错误:" + request.status);

                            }

                   }

         }

}

</script>

</body>

</html>

 

 

服务端的代码

<?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();

}

 

//通过员工编号搜索员工

functionsearch(){

         //检查是否有员工编号的参数

         //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;

}

 

//创建员工

functioncreate(){

         //判断信息是否填写完全

         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"]. " 信息保存成功!";

}

 

 

同时,我们可以用jquery来实现异步操作,会更加方便,主要有三个方法$.get,$.post和$.ajax方法

部分代码

 

 

三、跨域

关于跨域的知识,可以参考下我转载的另一篇文章

Javascript处于安全方面的考虑,不允许跨域调用其他页面的对象。而跨域就是因为Javascript的同源策略的限制。a.com域名下的js无法操作b.com或是c.a.com域名下的对象

补充:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值