本文所用程序来自《Ajax模式与最佳实践》
1、由于不同的浏览器创建XMLHttpRequest对象的方式不一样,所以有必要对XMLHttpRequest对象的创建进行封装。使用工程方法模式:
factory.js中的XMLHttpRequest对象创建的代码如下
function FactoryXMLHttpRequest(){
// 除了Microsoft的IE,其他的浏览器都能返回XMLHttpResult对象
if(window.XMLHttpRequest){
return new XMLHttpRequest();
}
else if(window.ActiveXObject){
// 枚举IE中XMLHttpResult对象的创建
var msxmls = new Array(
'Msxml12.XMLHTTP.5.0',
'Msxml12.XMLHTTP.4.0',
'Msxml12.XMLHTTP.3.0',
'Msxml12.XMLHTTP',
'Microsoft.XMLHTTP'
);
for(var i = 0; i < msxmls.length; i++){
try{
return new ActiveXObject(msxmls[i]);
}catch(e){
}
}
}
// 无法创建将抛出异常
throw new Error("不能创建XMLHttpRequest对象!");
}
2、封装异步请求对象
Asynchronous.js的封装代码如下:
// 定义Asynchronous对象
function Asynchronous(){
// 定义Asynchronous对象的_xmlhttp属性并初始化为一个XMLHttpRequest对象
this._xmlhttp = new FactoryXMLHttpRequest();
}
function Asynchronous_call(url){
// 此变量在匿名内部类中使用,由javascript管理,对象呗回收的时候此变量才会被回收
var instance = this;
// 第三个参数为true,表示使用异步请求的方式
this._xmlhttp.open('GET',url,true);
this._xmlhttp.onreadystatechange = function(){
switch(instance._xmlhttp.readyState){
case 1: // 请求正在被处理,结果不应该被处理
instance.loading();
break;
case 2: // 请求已经加载了结果数据,正在对数据进行访问钱的准备
instance.loaded();
break;
case 3: // 脚本可以与XMLHttpRequest对象进行交互,然而数据尚未完全加载完成
instance.interactive();
break;
case 4: // 请求和结果都已经加载完成,并且加载为一个对象模型
instance.complete(instance._xmlhttp.status,
instance._xmlhttp.statusText,
instance._xmlhttp.responseTest,
instance._xmlhttp.responseXML);
break;
}
};
this._xmlhttp.send(null);
}
function Asynchronous_loading(){}
function Asynchronous_loaded(){}
function Asynchronous_interactive(){}
function Asynchronous_complete(status, statusText, responseText, responseXML){}
Asynchronous.prototype.loading = Asynchronous_loading;
Asynchronous.prototype.loaded = Asynchronous_loaded;
Asynchronous.prototype.interactive = Asynchronous_interactive;
Asynchronous.prototype.complete = Asynchronous_complete;
Asynchronous.prototype.call = Asynchronous_call;
为了用javascript声明一个类,你需要声明一个具有这个类名的函数。声明的函数叫做一个
构造器。在类Asynchronous的情况下,需要声明一个标识为Asynchronous的函数。当一个类使用new关键字实例化时,对象是空的,简单的说就是没有方法和属性。
可以使用prototype属性来定义默认的属性和方法。当使用prototype属性进行定义时,每个定义的方法和属性在所有这种类型的实例之间共享。对于上面的Asynchronous类来说,有四个共享的方法:loading,loaded,interactive,complete,任何时候异步请求更新它的状态时都会调用。在默认情况下,所有方法不做任何事情,仅仅是一个占位符,这样不会发生任何异常。如果没有使用prototype属性,在构造器中分配方法,每个实例将拥有自己的一份函数副本。
对以上实现的一个用法如下(客户端):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script language="javascript" src="js/factory.js"></script>
<script language="javascript" src="js/asynchronous.js"></script>
<script language="javascript" type="text/javascript">
function asyncUpdateEvent(status, statusText, responseText, responseXML){
// alert(1);
document.getElementById('httpcode').innerHTML = status;
document.getElementById('httpstatus').innerHTML = statusText;
document.getElementById('result').innerHTML = responseText;
document.getElementById('xmlresult').innerHTML = responseXML;
}
function asyncUpdateEvent2(status, statusText, responseText, responseXML){
// alert(0);
document.getElementById('httpcode2').innerHTML = status;
document.getElementById('httpstatus2').innerHTML = statusText;
document.getElementById('result2').innerHTML = responseText;
document.getElementById('xmlresult2').innerHTML = responseXML;
}
var asynchronous1 = new Asynchronous();
asynchronous1.complete = asyncUpdateEvent;
var asynchronous2 = new Asynchronous();
asynchronous2.complete = asyncUpdateEvent2;
function call1(url){
// alert('call1');
asynchronous1.call(url);
}
function call2(url){
asynchronous2.call(url);
}
</script>
</head>
<body>
<button onclick="call1('http://localhost:8080/ajax/test1')">get a document</button>
<button onclick="call2('http://localhost:8080/ajax/test2')">get a document</button><br>
<table border="1">
<tr>
<td>docuemnt</td>
<td><span id="httpcode">no http status</span></td>
<td><span id="httpstatus">no http httpstatus</span></td>
<td><span id="result">no http result</span></td>
<td><span id="xmlresult">no http xmlresult</span></td>
</tr>
<tr>
<td>docuemnt</td>
<td><span id="httpcode2">no http status</span></td>
<td><span id="httpstatus2">no http httpstatus</span></td>
<td><span id="result2">no http result</span></td>
<td><span id="xmlresult2">no http xmlresult</span></td>
</tr>
</table>
</body>
</html>
分享到:
相关推荐
这里的`ajaxGet`函数接受一个URL和回调函数作为参数,当请求完成并成功时,回调函数会被调用,传入服务器返回的数据。 **3. 封装Ajax POST请求** POST请求常用于向服务器发送数据,如表单提交。封装POST请求的代码...
**Ajax(Asynchronous JavaScript and XML)**是一种在无需重新加载整个网页的情况下,能够...例如,jQuery的`$.ajax()`方法就是一个功能丰富的Ajax解决方案,它还支持Promise,使得异步操作更加易于管理和链式调用。
为了便于在项目中重复使用,我们可以将Ajax功能封装成一个函数。以下是一个简单的Ajax封装示例: ```javascript function ajax(obj) { var xhr = (function () { if (typeof XMLHttpRequest != 'undefined') { ...
在本章“项目1-博客前端:封装库--Ajax发文”中,我们将探讨如何使用Ajax技术来实现一个博客文章的发布功能。Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许我们在不重新加载整个页面的...
第一种方法涉及到JavaScript的FormData对象,它是一种可以轻松构建一组键值对来表示表单字段及其值,并用于发送文件的机制。开发者需要先获取到表单中选中的文件,并将其添加到FormData对象中,然后使用EasyAjax....
第一个方法可能返回服务器响应的字符串,这通常是通过设置回调函数,当请求完成时,将responseText作为参数传递给该函数。第二个方法可能返回一个XMLDocument对象,这可能意味着它将服务器返回的XML数据解析成了DOM...
在本章中,我们将探讨如何在前端开发中实现一个基于Ajax的博客换肤功能,这是一个常见于许多网站的用户自定义界面风格的实用特性。我们将分析问题所在,并通过HTML、CSS和JavaScript代码来理解实现这一功能的具体...
这里的Ajax调用使用了一个简单的对象,包含如下属性: - `method`:请求方法,这里是'POST'。 - `url`:服务器处理请求的URL,即'add.php'。 - `data`:发送的数据,这里使用了`serialize()`函数将表单数据序列化为...
在本章中,我们将探讨如何在前端项目中利用Ajax技术实现一个优雅的登录功能,以提升用户体验。Ajax(Asynchronous JavaScript and XML)的核心优势在于它允许网页在无需刷新整个页面的情况下与服务器进行交互,从而...
request有两个参数,第一个为请求的url(必要的),字符串类型,第二个opt为配置参数(可选的),对象类型。 目前提供的api: Ajax.request(url,option) Ajax.get(url,data,callback) 参数data,可缺省。 Ajax.post(url,...
还会讨论如何创建第一个Ajax请求,理解异步与同步的区别,以及如何利用JavaScript处理响应。 **第二章:数据格式** Ajax传输的数据可以是XML、JSON、HTML等多种格式。本章将深入探讨XML和JSON,它们在Ajax中的角色...
这可以通过监听第一个下拉框的change事件,然后发送Ajax请求获取新的选项数据,最后更新第二个下拉框。自动补全功能常用于输入框,当用户输入时,后台会返回匹配的建议列表。这通常结合keyup事件和$.ajax()实现,...
原生Javascript封装的AJAX函数是为了在不依赖于任何第三方库,如jQuery的情况下进行网络请求,这在某些情况下是非常有用的,尤其是当项目中没有引入jQuery或者想要减少项目依赖时。 在上述文档中,提到了一个名为...
第一章:Ajax精讲系列 - 预览课程部分 第一节Ajax精讲系列 - 课程预览部分 第二章:Ajax精讲系列 - 精讲系列教程部分 第一节Ajax精讲系列 - Ajax的基本概念及对方方法的使用原理 第二节Ajax精讲系列 - Ajax的封装原理...
**AJAX开发简略(第一版)** AJAX(Asynchronous JavaScript and XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器进行少量数据交换,使网页实现异步更新,提升了用户体验。...
"asp.net+ajax网站开发典型实例(第一篇)"这个主题意在通过具体的项目案例,帮助学习者理解如何将理论知识应用到实际开发中。实例通常涵盖常见的应用场景,如数据的异步加载、用户界面的动态更新等,有助于提升...
第一个实例可能是"发送GET请求"。在这个例子中,用户可能会触发一个按钮点击事件,JavaScript将利用XMLHttpRequest创建一个HTTP GET请求到服务器,获取数据。服务器处理请求后,返回的数据会被XMLHttpRequest的...
该方法接收两个参数,第一个参数是目标对象,第二个参数是源对象。该方法会将源对象的所有属性拷贝到目标对象上。 Ajax定义 Ajax定义了一个名为ZIP_Ajax的类,该类继承自Class.create()方法。ZIP_Ajax类的定义使用...
- 第一个参数:请求的URL。 - 第二个参数:一个可选的哈希对象,包含请求配置选项。 #### 四、请求方法与参数 - **请求方法**:`method`选项用来指定HTTP请求方法,默认为`POST`。推荐使用`GET`方法获取数据,...
### 第一步:引入jQuery库 在开始封装之前,我们需要确保项目中已经正确引入了jQuery库。通常的做法是在HTML文件的`<head>`标签内加入如下代码: ```html <script type="text/javascript" src="<%=path%>/...