封装自己的Ajax框架

Ajax技术就是利用javascript和xml实现异步交互的功能。

首先先来介绍一下Ajax相关知识点

一、Ajax对象的创建

1、创建Ajax对象的方式

a、第一种方式是针对IE浏览器

b、第二种方式针对w3c:在IE的高版本(IE8+),已经支持了XMLHttpRequest类

2、解决兼容性

a、创建公共文件 public.js

b、在需要使用ajax对象的页面中,包含以上js文件

二、ajax对象的相关属性和方法

方法:

1、初始化ajax对象 open(method,url)

   method:请求方式  get、post

   url:请求地址

2、设置请求头信息 setRequestHeader(header,value)

  header:请求头的名称

  value:请求头的信息

3、开始发送请求 send(content)

  只有当ajax对象的send方法被调用时,才会发送请求

  content :post请求时所传递的数据,get请求时这里直接设置为null

属性:

1、当ajax对象状态码发生改变时所触发的回调函数:onreadystatechange

  它的值是一个函数首地址(匿名函数)

  xhr.onreadystatechange = function(){}

2、ajax对象的状态码(一个数字,从0-4): readyState

 

3、ajax对象接收到的响应状态码(常用)(200、302、404):status

4、ajax对象接收到的http响应状态文本(不常用):statusText

5、ajax对象接收到http响应主体字符串(text/html):responseText

6、ajax对象接收到的http响应主体内容(text/xml):responseXML

三、发送GET请求

1、 向服务器发送用户名,并返回hello,zhangsan

php代码如下:return:返回,将结果返回给php程序本身echo:输出,利用http协议将数据响应给客户端
上面代码不足之处:a、如果将请求地址改为一个不存在的页面地址,那么服务器仍然会返回一个错误信息,而我们的程序应该在得到一个正确的返回结果后才去对数据进行处理。

2、解决IE缓存问题(将服务器端的PHP略做修改)

在IE下,仍然输出hello,zhangsan、其他浏览器中是正常输出原因:在IE中,默认有缓存功能,将每次获取的php文件的输出结果缓存下来,下次ajax对象请求时,如果在缓存目录下,找到对应缓存文件,就直接使用缓存文件。解决方式:a、在url后面加随机数:Math,random( );
  var URL = "demo.php?name=zhangsan&n="+Math.random();
b、在url后面加(毫秒)时间戳:new Date().getTime();
  var URL = "demo.php?name=lisi&n="+new Date().getTime();
以上两种方法确保每次请求的url是唯一的。

c、设置ajax对象的请求头,if-modified-since,强制让ajax对象发送请求。  0:表示文件最后修改时间会和服务器上这个资源文件最后修改时间进行比较,肯定是不同的,所以服务器返回了最新数据
  xhr.setRequestHeader("If-Modified-Since","0");
以上三种方式并没有根本上解决缓存问题,前两种方式更是缓存下来N个文件。

d、设置http响应头中的cache-control选项,告诉浏览器不要缓存,必须每次重新请求

实例:检查用户名是否可用

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>检查用户名是否存在</title>
 6     <script src="jquery-1.12.4.min.js"></script>
 7     <script src="public.js"></script>
 8     <script>
 9         $(function(){
10             //创建ajax对象,此时状态码为0
11             var xhr =creatxhr();
12             $("#name").blur(function () {
13                 var name = $(this).val();
14                 //方法1:随机数
15                 var URL = "demo.php?name="+name+"&n="+new Date().getTime();
16                 //初始化ajax对象  此时状态码为1
17                 xhr.open("get",URL);
18                 //ajax对象状态码发生改变时所触发的回调函数
19                 xhr.onreadystatechange = function(){
20                     //状态码为4说明接收完毕,做进一步的处理
21                     if(xhr.readyState == 4 && xhr.status == 200){
22                         if(xhr.responseText == 1){
23                             $(".error").html("用户名已存在").css({display:"inline-block",color:"red"});
24                         }else{
25                             $(".error").css({display:"none"});
26                             return false;
27                         }
28                     }
29                 };
30                 //发送请求,此时状态码为2
31                 xhr.send(null);
32             });
33
34         })
35     </script>
36 </head>
37 <body>
38 <form>
39     <div class="form-group">
40         <label for="name">用户名:</label>
41         <span class="error"></span>
42         <input type="text" id="name" placeholder="请输入用户名">
43     </div>
44 </form>
45 </body>
46 </html>

验证用户名是否存在

 1 /**
 2  * Created by 123 on 2017/7/30.
 3  */
 4 //第一种创建ajax对象
 5 function creatxhr(){
 6     var xhr;
 7     var str = window.navigator.userAgent;
 8     //判断是否为IE浏览器,如果是创建相应的ajax对象
 9     if(str.indexOf("MSIE") >0){
10         xhr = new ActiveXObject();
11     }else{
12         xhr = new XMLHttpRequest();
13     }
14     return xhr;
15 }
16 //另外一种创建ajax对象
17 function creatxhr1(){
18     try{return new ActiveXObject();}catch(e){}
19     try{
20         return new XMLHttpRequest();
21     }catch(e){
22         alert("请更换浏览器!");
23     }
24 }

public.js代码

 1 <?php
 2 //禁止客户端缓存数据
 3 header("Cache-Control:no-cache,must-revalidate");
 4     $name = $_GET[‘name‘];
 5     //连接数据库服务器、选择数据库
 6     mysql_connect("localhost","root","111111");
 7     mysql_select_db("shop");
 8     mysql_query("set names gb2312");
 9     //sql语句
10     $sql = "select * from  users where username = ‘$name‘";
11     $result =mysql_query($sql);
12     $num = mysql_num_rows($result);
13     $num大于表示表中已经存在一条记录
14     mysql_close();
15     //根据结果集总行数返回0或1.0表示用户名不存在,1表示用户名已存在
16     if($num > 0){
17         echo 1;
18     }else{
19         echo 0;
20     }
21 ?>

demo.php代码

四、发送post请求

1、get和post的区别

a、get请求将参数放到请求地址url的后面

b、post请求时将参数放在http请求空白行的后面

c、get请求时参数大小有限制

d、post请求理论上对参数大小无限制

e、postt比get安全一些

2、其他不同

post请求时,除了参数格式不同之处,还比get请求多了一个Content-Type的请求头,它的值是application-form-urlencoded,表示本次提交的数据是字符数据,同时post还可以同时提交二进制数据和字符数据,如:multipart/form-data

ajax发送请求其实就是模拟http请求

ajax对象的post请求也要加上content-type的请求头

3、代码

a、xhr.open("post","demo.php") post请求  demo.php后面没有参数

b、xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")

  设置请求头信息:

    content-type:传递数据的数据类型

    application/x-www-form-urlencoded:表示数据是字符数据

c、xhr.send(data);data:会自动将参数放到请求空白行的后面

4、计算两个数的四则运算

如果想做四则运算的话,上面的代码稍微修改下:

如果需要从服务器返回多个结果,可以将结果拼接一个字符串,使用一个指定的分隔符,如:"|",在客户端程序中,再将字符串按照分隔符进行分割。

5、文件上传

以post形式提交数据:method=post

指定提交的数据可以是二进制数据或字符数据:enctype="multipart/form-data"

以上是封装自己的ajax框架用到的知识点,今天先写到这,明天开始写框架。

时间: 2024-10-23 18:17:35

封装自己的Ajax框架的相关文章

自己封装的Ajax框架——myAjax.js

以下是myAjax.js文件的全部内容,用法都在注释中,请查看.    封装的不好,请各位批评指正~~ /** * myAjax.js file is used by created Ajax in Web page.  这个文件是封装好的Ajax包,可以直接调用 * @Author: Alvin Xing  邢** * @Param:  servlet: It is servlet that deal with this Ajax.  需要处理的servlet(或者jsp或其他html) *

Ajax工作原理以及常用的Ajax框架

1,关于同步和异步 异步传输是面向字符的传输,它的单位是字符:而同步传输是面向比特的传输,它的单位是桢,它传输的时候要求接受方和发送方的时钟是保持一致的. ajax可以提升用户体验,它是利用异步请求方式的.打个比方,如果现在你家里所在的小区因 某种情况而面临停水,现在有关部门公布了两种方案,一是完全停水8个小时,在这8个小时内完全停水,8个小时后恢复正常.二是不完全停水10 个小时,在这10个小时内水没有完全断,只是流量比原来小了很多,在10个小时后恢复正常流量,那么,如果是你你会选择哪种方式呢

AJAX(二)AJAX框架

上文(AJAX(一)AJAX的简介和基础)对ajax异步请求服务器做了详细的介绍和基础应用,可以看出,ajax的一些过程是相对不变的.不必要每次发送请求都写一遍发送代码,一些ajax开发人员已经把他们的过程封装成ajax框架. 本节主要介绍ajaxLib和ajaxGold两款框架. 1.ajaxLib ajaxLib是一个非常小巧的ajax框架. 使用它首先将文件使用引入到页面中.改框架是一个直接获取XML的框架,调运函数如下: loadXMLDoc(url,callback,boolean)

LoadRunner测试ajax框架,回放后系统中没有产生数据解决方法

LoadRunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,数据始终不能写入数据库.查了一下原因,应该是录制的脚本不完善的问题,因为JS是在客户端执行的程序,LR只能监控客户机与服务器之前的通信. 解决方法: Recording options> HTTP Properites> Advanced > Headers: 选择"Record headers not in list", 然后点ok. 重新录制一遍脚本,会发现脚本里多出一

jQuery-1.9.1源码分析系列(十六)ajax——ajax框架

ajax的介绍就不多说了,点击可看. 既然是ajax框架,那么闲谈一谈jQuery的ajax处理思路. 现在的浏览器都支持ajax,只不过不同的浏览器使用方法可能有不同(IE使用new window.ActiveXObject("Microsoft.XMLHTTP"),标准浏览器使用new window.XMLHttpRequest()).如果按照这种思路,貌似jQajax只需要做好兼容处理就行了? 不是的,原生的ajax有一个说大不大说小不小的缺点——不支持跨域(同源策略由来已久,自

Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架

Android6.0执行时权限解析,RxPermissions的使用.自己封装一套权限框架 在Android6.0中,新添加了一个执行时的权限,我相信非常多人都已经知道了.预计也知道怎么用了,这篇博客非常easy.就是告诉大家怎样去申请执行时权限和RxPermission这个权限框架的使用.同一时候依据现有的技术封装思想,去封装一个自己可用的权限框架,好的,我们继续往下看 一.Android M 执行时权限介绍 关于Android M的更新变化,我就不啰嗦了,有兴趣的能够看下Android M更

使用原生JS实现一个风箱式的demo,并封装了一个运动框架

声明,该DEMO依托于某个培训机构中,非常感谢这个培训结构.话不多说,现在开始改demo的制作. 首先,在前端的学习过程中,轮播图是我们一定要学习的,所以为了更加高效的实现各种轮播图,封装了一个运动的框架. 1 function getStyle(obj,attr) { 2 if(obj.currentStyle){ 3 return obj.currentStyle[attr];//为了获取IE下的属性值 4 }else{ 5 return window.getComputedStyle(ob

loadrunner测试ajax框架

loadrunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,解决方法 loadrunnerajax框架测试脚本headerajax [问题描述]用loadrunner测试ajax框架的系统时,录制回放都没有报错,但是回放后系统中没有产生数据,数据始终不能写入数据库.查了一下原因,应该是录制的脚本不完善的问题,因为JS是在客户端执行的程序,LR只能监控客户机与服务器之前的通信. [解决方法]: Recording options> HTTP Properites

几种流行的AJAX框架对比:Jquery,Mootools,Dojo,ExtJs,Dwr

1:Jquery 主页:http://jquery.com/ 设计思想:简洁的方案思想,几乎所有操作都是以选择DOM元素(有强大的Selector)开始,然后是对其的操作(Chaining等特性). 优点: 文件小,压缩后代码只有20多k,无压缩代码94k.Selector和DOM操作的方便: jQuery的Selector与mootools的Element.Selectors.js比较,CSS Selector, XPath Selector(1.2后已删除)Chaining:总是返回一个jQ