导读:上一篇博客简单介绍了一下对Ajax中的核心对象XMLHttpRequest的封装。那么为了方便对Ajax的应用,我们还需要进一步的对Ajax的基本功能进行下一步的封装,不得不说的是早就有人专门写JS或者说已经有JQ直接引入使用,所以,本篇博客则是站在一个学习实践的角度,用JavaScript原生代码实现Ajax的简单封装。

一、基本介绍

主要是实现了从客户端到服务端发送请求,继而接收服务端响应的结果的过程。在这个实现过程中,一共有3个物件:其一是运用了一个HTML页充当了客户端;其二是运用了一个web页充当了服务端;最后是一个JS文件,在这个JS文件中,实现了对Ajax的封装。

在理解ajax的局部刷新的时候,可以将这一小部分看成是一个网页的一个组成部分去看。

二、实现过程

2.1,JavaScript1(Ajax的封装)

备注:本JS代码是从网上查询,然后拼凑的,并不是原创!

<span style="font-family:KaiTi_GB2312;font-size:18px;">var createAjax = function () {
var xhr = null;
try {//IE系列浏览器
xhr = new ActiveXObject("microsoft.xmlhttp");
} catch (e1) {
try {//非IE浏览器
xhr = new XMLHttpRequest();
} catch (e2) {
window.alert("您的浏览器不支持ajax,请更换!");
}
}
return xhr;
};
var ajax = function (conf) {
var type = conf.type;//type参数,可选
var url = conf.url;//url参数,必填
var data = conf.data;//data参数可选,只有在post请求时需要
var dataType = conf.dataType;//datatype参数可选
var success = conf.success;//回调函数可选
//解决缓存的转换
if (url.indexOf("?") >= 0) {
url = url + "&t=" + (new Date()).valueOf();
} else {
url = url + "?t=" + (new Date()).valueOf();
}
//解决跨域问题
if (url.indexOf("http://") >= 0) {
url.replace(">", "&");
url = url + "Proxy?url=";
}
if (type == null) {//type参数可选,默认为get
type = "get";
}
if (dataType == null) {//dataType参数可选,默认为text
dataType = "text";
}
var xhr = createAjax();
xhr.open(type, url, true);
if (type == "GET" || type == "get") {
xhr.send(null);
} else if (type == "POST" || type == "post") {
xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
xhr.send(data);
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
if (dataType == "text" || dataType == "TEXT") {
if (success != null) {//普通文本
success(xhr.responseText);
}
} else if (dataType == "xml" || dataType == "XML") {
if (success != null) {//接收xml文档
success(xhr.responseXML);
}
} else if (dataType == "json" || dataType == "JSON") {
if (success != null) {//将json字符串转换为js对象
success(eval("(" + xhr.responseText + ")"));
}
}
}
};
};</span>

说明:在这里有三个注意的地方:

1,个人之前在运用try catch的时候,是以为以为catch只能运用一次捕捉异常,最近在J2SE里面的异常机制里面,才学习到可以多次使用。所以,在这里,首先是尝试着对IE浏览器进行XMLHttpRequest对象的创建,然后尝试在非IE浏览器上创建,最后当这两种都不行的时候,捕捉异常进行处理。注:为什么要分IE类和非IE类,这和每种类型浏览器的内核有关。

2,在设置回调函数的时候,对不同返回的数据类型进行了处理,那么也就是说我们还需要对数据类型的处理方式进行封装,这一块在本篇博客中未实现。

3,这个ajax的封装和之前对于XMLHttpRequest对象的封装有什么不同?其实整体都是5步,在上一篇博客中,将POST和GET方式分别写了,包括这次封装的时候也是尝试着去分别运用5步使用法封装,后来才写成了现在这样。

2.2,HTMLPage1(客户端)

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;"><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script src="JavaScript1.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>测试Ajax的JS封装</title> <script type="text/javascript">
function btn_click() {
var username = document.getElementById("txt_username").value;
var age = document.getElementById("txt_age").value;
ajax({
type: "get",
url: "WebForm1.aspx?username=" + username
+ "&age=" + age,
success: function (data) {
if (data == "yes") {
alert("134");
} else {
alert("asdg");
}
}
});
}
</script>
</head>
<body>
<label for="txt_username">姓名:</label>
<input type="text" id="txt_username" />
<br /><br/>
<label for="txt_age">年龄:</label>
<input type="text" id="txt_age" />
<br /><br/>
<input type="button" value="测试请求" style="margin-left:20px;" id="btn" onclick="btn_click();" /> </body>
</html>
</span></span>

2.3,WebForm1页(模拟服务器端)

备注:页面显示无代码

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication1
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
string myUserName = Request.QueryString["username"]; string myAge = Request.QueryString["age"];
if (myUserName == "12" && myAge == "23")
{
Response.Write("yes");
}
else {
Response.Write("no");
}
Response.End();
}
}
}</span></span>

说明:在这一步获取HTMLPage1所传送过来的数据,并对此做出响应。

2.4,测试结果

说明:本次测试要想实现的效果是,当姓名和年纪的输入框中填入的数据分别为12和23时,在服务端的响应是“yes”,而其他的数据响应是“no”。再根据服务器端的响应数据发送到页面做出显示,yes=“134”,no=“asdg”.

三、总结

我们说既然已经有了JQ封装好的方法,为什么还要了解JS的具体封装,那么JQ是用什么实现的?这版代码一直在参考,为了写出这版代码,看了很多别的代码,写毁了好多行代码。但是现在看代码的能力又不一样了。

接下来要了解的是,JQ是怎么封装的,它和JS封装的有什么不同,从而进一步区分JS和JQ的联系,再是运用到整个BS开发中的作用和区别。

最新文章

  1. 关于Ruby常用语法案例累积
  2. 在 JS 中使用 fetch 更加高效地进行网络请求
  3. linux socket连接中 ERRNO错误
  4. Java学习-048-插件应用之 Find Bugs
  5. Vmware vsphere webservice sdk 连接打开慢的问题
  6. 压缩 &amp; 解压缩 命令汇总:tar、zip &amp; unzip、
  7. 微信电脑版也能用公众号自定义菜单 微信1.2 for Windows发布
  8. Android Terminal telnet windows
  9. Optimal Milking
  10. 页面添加 mask 遮罩层
  11. 注册nodejs程序为windows服务
  12. 【Nutch2.3基础教程】集成Nutch/Hadoop/Hbase/Solr构建搜索引擎:安装及运行【集群环境】
  13. 初始seajs
  14. 关于ligerform中select与text的赋值与取值
  15. MVC工作流程
  16. CharSequence的getText()与String的getString()(转)
  17. 【iOS】7.4 定位服务-&gt;2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
  18. js同时使用多个分隔符分割字符串.
  19. [转]GO err is shadowed during return
  20. 20175314 实验二 Java面向对象程序设计

热门文章

  1. HttpURLConnection 发送PUT请求 json请求体 与服务端接收
  2. AJPFX谈Java 性能优化之基本类型 vs 引用类型
  3. pageHelper分页插件失效问题
  4. Implicit Animations 默认动画 读书笔记
  5. Hive工具类
  6. CentOS 6.5下安装Python 3.5.2(与Python2并存)
  7. python基础一 day2
  8. 最短路 || Codeforces 938D Buy a Ticket
  9. Calling method &#39;get&#39; is not valid without an active transaction
  10. python之range (范围)