大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说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语句以分号结尾(;)
例子(员工查询和添加):
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的学习笔记。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/37181.html