自己动手封装的 ajax

以前开发用了很多AJAX的技术比如EXT,prototype,jQuery等等,但都是开源封装好的AJAX框架。从没真正用过纯正的AJAX,故参照prototyp面向对象思想自己封装了一个AJAX框架。希望能给读者参考、帮助、评价。

复制代码 代码如下:

/*

* 自己封装的ajax

*

*

* @author 姜松

* @version 1.00 $date:2009-07-02

*

* history:

*

*/

Object.extend = function(destination, source) {

for (var property in source) {

destination[property] = source[property];

}

return destination;

};

Object.extend(String.prototype, {

include: function(pattern) {

return this.indexOf(pattern) > -1;

},

startsWith: function(pattern) {

return this.indexOf(pattern) == 0;

},

endsWith: function(pattern) {

return this.lastIndexOf(pattern) == (this.length - pattern.length);

},

empty: function() {

return /^\s*$/.test(this) || this == undefined || this == null;

}

});

Object.extend(Array.prototype, {

each: function(iterator) {

try {

for (var i = 0, length = this.length; i < length; i++) {

iterator(this[i]);

}

} catch (e) {

if (e != 'break') { throw e };

}

},

clear: function() {

this.length = 0;

return this;

},

first: function() {

return this[0];

},

last: function() {

return this[this.length - 1];

},

indexOf: function(object) {

for (var i = 0, length = this.length; i < length; i++) {

if (this[i] == object) {return i};

}

return -1;

},

size: function() {

return this.length;

},

include: function(object) {

var found = false;

this.each(function(value) {

if (value == object) {found = true; throw 'break';}

});

return found;

}

});

function $(element) {

if(arguments.length > 1) {

for(var i = 0, elements = [], length = arguments.length; i < length; i++) {

elements.push($(arguments[i]));

}

return elements;

}

if(typeof element == 'string') {

element = document.getElementById(element);

}

return element;

};

var ajax = {

transport: new Object(),

options: new Object(),

getTransport: function() {

if(window.ActiveXObject) {

try {

return new ActiveXObject('Msxm12.XMLHTTP');

} catch(e) {

try {

return new ActiveXObject('Microsoft.XMLHTTP');

} catch(e) {}

}

} else if(window.XMLHttpRequest) {

try {

return new XMLHttpRequest();

} catch(e) {}

}

},

setOptions: function(options) {

ajax.options = {

method: 'get',

asynchronous: true,

contentType: 'application/x-www-form-urlencoded',

encoding: 'utf-8',

parameters: ''

};

Object.extend(ajax.options, options);

ajax.options.method = ajax.options.method.toUpperCase();

},

request: function(url, options) {

ajax.transport = ajax.getTransport();

ajax.setOptions(options);

this.method = ajax.options.method;

var params = ajax.options.parameters;

if (!['GET', 'POST'].include(this.method)) {

this.method = 'GET';

}

if (this.method == 'GET') {

url = ajax.setParameters(url, params);

}

try {

ajax.transport.open(this.method, url, ajax.options.asynchronous);

ajax.transport.onreadystatechange = ajax.stateChange;

ajax.setRequestHeaders();

this.body = this.method == 'POST' ? params : null;

ajax.transport.send(this.body);

} catch (e) {}

},

stateChange: function() {

try {

var readyState = ajax.transport.readyState;

if(readyState == 4) {

var status = ajax.transport.status, transport = ajax, json = ajax.evalJSON();

if(status == 200) {

ajax.options['onSuccess'](transport, json);

} else {

ajax.options['onFailure'](transport, json);

}

}

} catch (e) {}

},

setParameters: function(url, params) {

if (params && typeof params == 'string') {

url += (url.include('?') ? '&' : '?') + params;

} else if (params && typeof params == 'object') {

for(var param in params) {

url += (url.include('?') ? '&' : '?') + param + '=' + params[param];

}

}

return url;

},

setRequestHeaders: function() {

var headers = {

'X-Requested-With': 'XMLHttpRequest',

'Accept': 'application/xml, text/xml, text/html, text/javascript, application/javascript, application/json, text/javascript, text/plain, */*',

'If-Modified-Since': 'Thu, 01 Jan 1970 00:00:00 GMT'

};

this.method = ajax.options.method;

if (this.method == 'POST') {

headers['Content-type'] = ajax.options.contentType +

(ajax.options.encoding ? '; charset=' + ajax.options.encoding : '');

if (ajax.transport.overrideMimeType &&

(navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) {

headers['Connection'] = 'close';

}

}

for (var name in headers) {

ajax.transport.setRequestHeader(name, headers[name]);

}

},

evalJSON: function() {

try {

return eval('(' + ajax.transport.responseText + ')');

} catch (e) {}

}

};

var Form = {

serialize: function(element) {

var elements = $(element).all;

var queryComponents = [];

for(var i = 0; i < elements.length; i++) {

var parameter = null, method = elements[i].tagName.toLowerCase();

if(['input', 'select', 'textarea'].include(method)) {

parameter = Form.Serializers[method](elements[i]);

}

if(parameter != null && parameter.constructor == Array) {

var key = encodeURIComponent(parameter[0]);

var value = encodeURIComponent(parameter[1]);

queryComponents.push(key + '=' + value);

}

}

return queryComponents.join('&');

},

request: function(options) {

var params = this.toQueryParams(options.parameters);

options.parameters = this.serialize(this.form);

if(params) {

options.parameters = options.parameters.concat('&' + params);

}

if($(this.form).method) {

options.method = $(this.form).method;

}

return new ajax.request($(this.form).action, options);

},

toQueryParams: function(params) {

var queryComponents = [];

if (params && typeof params == 'string') {

queryComponents.push(encodeURIComponent(params));

} else if (params && typeof params == 'object') {

for(var param in params) {

var key = encodeURIComponent(param);

var value = encodeURIComponent(params[param]);

queryComponents.push(key + '=' + value);

}

}

return queryComponents.join('&');

}

};

Form.Serializers = {

input: function(element) {

switch(element.type.toLowerCase()) {

case 'checkbox':

case 'radio':

return this.inputSelector(element);

default:

return this.textarea(element);

}

},

inputSelector: function(element) {

if(element.checked) {

return [element.name, element.value];

}

},

textarea: function(element) {

return [element.name, element.value];

},

select: function(element) {

return this[element.type == 'select-one' ?

'selectOne' : 'selectMany'](element);

},

selectOne: function(element) {

var value = null, option, index = element.selectedIndex;

if(index >= 0) {

option = element.options[index];

value = option.value == (undefined || '') ? option.text : option.value;

}

return [element.name, value];

},

selectMany: function(element) {

var value = [];

for(var i = 0; i < element.length; i++) {

var option = element.options[i];

if(option.selected) {

var optvalue = option.value == (undefined || '') ? option.text : option.value;

value.push(optvalue);

}

}

return [element.name, value];

}

};

function $F(element) {

this.form = element;

}

Object.extend($F.prototype, Form);

/**************************************************************

* 测试函数

*/

function onTest() {

//get提交方法

var params = new Object();

params.ss = '张三';

new ajax.request('ajax.do?method=doGet', {

onSuccess: function(transport) {

alert(transport.evalJSON().xx)

},

parameters: params

});

//post form提交方法

var params = new Object();

params.idd = 1000;

params.names = '张三'

new $F('form').request({

onSuccess: function(transport) {

alert(transport.evalJSON().xx);

},

parameters: params

});

}

时间: 2024-10-07 20:35:24

自己动手封装的 ajax的相关文章

自己动手封装的 ajax_AJAX相关

以前开发用了很多AJAX的技术比如EXT,prototype,jQuery等等,但都是开源封装好的AJAX框架.从没真正用过纯正的AJAX,故参照prototyp面向对象思想自己封装了一个AJAX框架.希望能给读者参考.帮助.评价. 复制代码 代码如下: /* * 自己封装的ajax * * * @author 姜松 * @version 1.00 $date:2009-07-02 * * history: * */ Object.extend = function(destination, s

jquery封装的ajax怎样跳转页面。

问题描述 jquery封装的ajax怎样跳转页面. $.post("recmanager",{ "manager.account" : $('#manager').val(), "manager.password":$('#password').val(), },function(data){ //alert(data.result); if(data.result=="success"){ alert('登陆成功'); }

关于jquery封装的ajax传值到javaWEB后台问题。

问题描述 关于jquery封装的ajax传值到javaWEB后台问题. 前台用了jquery,后台用了 struts2框架. 前台: $.ajax({ type : "POST", url : "recmanager.action", dataType : "json", data : { "manager" : $('#manager').val(), "password":$('#password').

有没有一种封装了Ajax的包,类似于dwr的那种

问题描述 今天我同学打电话问我知不知道一种用来操作前端的而不是操纵界面的包,还要是那种封装了Ajax的包,类似于dwr的那种,不知道哪位大神知道有的,告诉小弟一声,甚是感谢呀,跪求!!! 解决方案 解决方案二:jquery不就是吗解决方案三:就ajax不行吗?

对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache详解_jquery

虽然jquery的较新的api已经很好用了, 但是在实际工作还是有做二次封装的必要,好处有:1,二次封装后的API更加简洁,更符合个人的使用习惯:2,可以对ajax操作做一些统一处理,比如追加随机数或其它参数.同时在工作中,我们还会发现,有一些ajax请求的数据,对实时性要求不高,即使我们把第一次请求到的这些数据缓存起来,然后当相同请求再次发起时直接拿之前缓存的数据返回也不会对相关功能有影响,通过这种手工的缓存控制,减少了ajax请求,多多少少也能帮助我们提高网页的性能.本文介绍我自己关于这两方

关于二次封装jquery ajax办法示例详解

前言 Ajax 的全称是Asynchronous JavaScript and XML 异步的javaScript和XML AJax所涉及到得技术: 1.使用CSS和XHTML来表示. 2. 使用DOM模型来交互和动态显示. 3.使用XMLHttpRequest来和服务器进行异步通信.(核心) 4.使用javascript来绑定和调用. 在我们前端处理数据的时候免不了要 ajax 与后台通信, ajax 是通过 XMLHttpRequest 对象与服务器进行通信的, jquery 在 XMLHt

基于原生ajax与封装的ajax使用方法(详解)

当我们不会写后端接口来测试ajax时,我们可以使用node环境来模拟一个后端接口. 1.模拟后端接口可参考网站整站开发小例子,在打开命令窗口并转到所在项目文件夹下在命令行中输入npm install express --save,安装express中间件. 2.把当中的app.js的内容换成 var express=require('express'); //var path=require('path'); var app=express(); //app.set('view',path.jo

PHP封装返回Ajax字符串和JSON数组的方法

实例如下: <?php class DBDA { public $host="localhost"; public $uid = "root"; public $pwd = "123"; public $dbname = "mydb"; //成员方法 public function Query($sql,$type=1) { $db = new MySQLi($this->host,$this->uid,$t

一个封装的Ajax类

ajax|封装 用法:  new Ajax().Request(url,cmd,async,method,postString,title)  参数:  url: 请求页面URL(必填)  cmd: 返回值处理函数(必填)  async: 是否异步 ,(ture|false), 默认true  method: 请求方式,(post|get), 默认get  postString: 请求方式为post时,请求内容  title: 请求内容标题  [复制此代码]CODE:// Ajax 封装 200