`
Liner
  • 浏览: 141643 次
  • 性别: Icon_minigender_1
  • 来自: 西南边陲
社区版块
存档分类
最新评论

一个极简化的Ajax封装,回调接口和浏览器兼容性较好

阅读更多
>>注意:请下载后面(9楼)的v1.1正式版。如果要优先考虑IE7中的Native XHR,请自己把附件中bajax.js文件里的bajax_object函数替换一下(修改的代码在9楼的页面里——不想更新附件了)。

前一段时间写51ditu和动易的集成,现在准备改进成Ajax的。很早以前就知道了Ajax,但一直没有实际用过。
网上Google了一番,看了Sajax.php……

还是简单点好,自己写了个很小的封装,测试对浏览器的兼容性还不错,并且回调函数的接口比较友好。

另:经测试,发现如果是对同一个XMLHttpReques对象进行多次open、send等操作,IE会有Cache问题,Firefox正常。但如果是每一次都是重新new一个的话,IE就支持得很好了(Firefox自然不用说)。

用这个库(面向用户的其实就一个函数),不用考虑XMLHttpRequest的任何细节,就如同调用和定义普通的Js函数。

用法:
<script language="javascript" src="bajax.js"></script>
<script language="javascript">
function callback(req, id) {
    if(req.readyState == 4 && req.status == 200) {
        if(id)document.getElementById(id).innerHTML = req.responseText;
        //eval(req.responseText);
    }
}
</script>
<div id="someid"></div>
<div onClick="bajax_send('http://xxx.net/yourscript.php?xxx', callback, 'someid')">点击查看哦!</div>


附源码内容
var bajax_debug_enable = false;

// 主函数:
//(URL,回调函数,传递给回调函数的附加数据,方法,POST数据,是否异步)
function bajax_send(url, callback, fdata, method, sdata, asyn)
{
    fdata = (fdata === undefined)? null: fdata;
    method = method || "GET";
    sdata = (sdata === undefined)? null: sdata;
    asyn = (asyn === undefined)? true: asyn;

    var X = new bajax_object();
    if(asyn)
        X.onreadystatechange = function(){ callback(X, fdata); };
    X.open(method, url, asyn);

    if(bajax_debug_enable)
        bajax_debugger(callback);
    X.send(sdata);

    if(asyn) return X;
    else callback(X, fdata);
}

// 兼容IE与其它浏览器(From Sajax.php v0.12)
function bajax_object()
{
    var A;
    var _msxmlhttp = new Array(
        'Msxml2.XMLHTTP.5.0',
        'Msxml2.XMLHTTP.4.0',
        'Msxml2.XMLHTTP.3.0',
        'Msxml2.XMLHTTP',
        'Microsoft.XMLHTTP');
    for(var i = 0; i < _msxmlhttp.length; i++) {
        try {
            if(A = new ActiveXObject(_msxmlhttp[i])) break;
        } catch (e) {
            A = null;
        }
    }
    if(!A && typeof XMLHttpRequest != "undefined")
        A = new XMLHttpRequest();
    if(!A)
        alert("Could not create connection object.");

    return A;
}

// Debug information...
function bajax_debugger(func)
{
    var S = func.toString();
    alert('[Running] ' + S.slice(9, S.indexOf(')', 10)) + ')');
}
  • bajax.js.rar (1.3 KB)
  • 描述: Ajax 简易封装.修订
  • 下载次数: 279
分享到:
评论
11 楼 Liner 2007-07-24  
不好意思,请教hax:
按照你的说法:req.onreadystatechange = null;
但是这行代码在IE6中会出现运行时错误提示(Firefox中正常),何解?
这样的代码应该不是纸上谈兵吧。谢了。
10 楼 Liner 2007-07-23  
唉。。。。干脆彻底改一下,用OO封装得了。(谢谢hax提供的修补)
以下为Bajax的正式版,呵呵  。用法与前面稍有不同。

用法:
<script language="javascript" src="bajax.js"></script>
<script language="javascript">
function callback(req, id) {
    var _node = document.getElementById(id);
    // 直接使用req的响应值
    if(_node) _node.innerHTML = 'Hai ' + req.responseText;
}
var _obj = new Bajax();
</script>
<div id="someid"></div>
<div onClick="_obj.get('/script.php?name=Liner', callback, 'someid')">GET方法</div>
<div onClick="_obj.post('/script.php', 'name=Liner', callback, 'someid')">POST方法</div>

源代码:
/** bajax.js
 *  Base Ajax 简易封装 2007.07.20
 *  ---------------------------------------------------------------------------
 *  >>接口:
 *      get, post	常用普通接口。
 *      e_handler	出错处理句柄,可选。
 *      _object		创建浏览器兼容XHR的包装。
 *
 *  >>参数:
 *      @url:		请求的响应页面;
 *      @sdata:		POST的数据;
 *      @callback:	处理响应数据的回调函数;
 *
 *  以下参数可选
 *      @fdata:		传递给回调函数的数据,默认null;
 *      @asyn:		是否异步,默认true。
 *
 *  返回值:
 *      如果是异步,返回异步请求对象;否则不返回。
 *
 *  >>回调函数:
 *
 *      回调函数有两个参数:(req, data)
 *      @req:		异步请求对象(XMLHttpRequest 或 ActiveXObject)
 *      @data:		传入的附加数据。
 *
 *  >>注意:
 *
 *      1、传递到回调函数的附加数据可以是数值、字串、数组或对象。
 *      2、可置e_handler的参数为null来取消出错处理。
 *
 *  @Author: Tubz.
 *  @Copyright: GNU - LGPL.
 *  ---------------------------------------------------------------------------
 */

function Bajax()
{
    // 默认出错处理
    this._eh = Bajax._error;
}

// 调试设置
Bajax.debug_enable = false;

//-- 用户接口 -----------------------------------------------------------------

// GET 请求
//(URL, 回调函数[, 回调函数附加数据, 是否异步])
Bajax.prototype.get = function (url, callback, fdata, asyn)
{
    fdata = (fdata === undefined)? null: fdata;
    asyn = (asyn === undefined)? true: asyn;
    var _self = this;

    var X = Bajax._object();
    if(asyn)
        X.onreadystatechange = function()
        { Bajax._callback(X, callback, fdata, _self); };
    X.open('GET', url, asyn);

    if(Bajax.debug_enable)
        Bajax._debugger(callback);

    X.send(null);

    if(asyn){
        return X;
    }else{
        Bajax._callback(X, callback, fdata, _self);
    }
}

// POST 请求
//(URL, POST数据, 回调函数[, 回调函数附加数据, 是否异步])
Bajax.prototype.post = function (url, sdata, callback, fdata, asyn)
{
    fdata = (fdata === undefined)? null: fdata;
    asyn = (asyn === undefined)? true: asyn;
    var _self = this;

    var X = Bajax._object();
    if(asyn)
        X.onreadystatechange = function()
        { Bajax._callback(X, callback, fdata, _self); };
    X.open('POST', url, asyn);

    if(Bajax.debug_enable)
        Bajax._debugger(callback);

    X.setRequestHeader('Content-length', sdata.length);
    X.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

    X.send(sdata);

    if(asyn){
        return X;
    }else{
        Bajax._callback(X, callback, fdata, _self);
    }
}

// 设置出错处理函数
Bajax.prototype.e_handler = function (func)
{
    if(func !== undefined) this._eh = func;
}

// 创建一个兼容的XHR对象。
// 改了一下:IE7中优先采用Native XHR
Bajax._object = function()
{
    var A;
    if(typeof XMLHttpRequest != 'undefined') {
        A = new XMLHttpRequest();
    }else{
        var _msxmlhttp = new Array(
            'Msxml2.XMLHTTP.6.0',
            'Msxml2.XMLHTTP.3.0',
            'Msxml2.XMLHTTP',
            'Microsoft.XMLHTTP');
        for(var i = 0; i < _msxmlhttp.length; i++) {
            try {
                if(A = new ActiveXObject(_msxmlhttp[i])) break;
            } catch (e) {
                A = null;
            }
        }
    }
    if(!A)
        alert("Could not create connection object.");
    return A;
}

//-- 私有函数 -----------------------------------------------------------------

Bajax._callback = function (req, callback, data, obj)
{
    if(req.readyState == 4) {
        if(req.status != 200) {
            //req.onreadystatechange = null;
            if(obj._eh) obj._eh(req, callback);
        }else{
            callback(req, data);
            //req.onreadystatechange = null;
        }
    }
}

// Debug: 显示采用的回调函数。
Bajax._debugger = function (func)
{
    alert('running: ' + Bajax._fname(func));
}

// 默认的出错处理
Bajax._error = function (req, callback)
{
    alert(req.statusText + '\nShould run: ' + Bajax._fname(callback));
}

// 提取函数名(含参数)
Bajax._fname = function (func)
{
    var S = func.toString();
    return S.slice(9, S.indexOf(')', 10)) + ')';
}
//-- End.----------------------------------------------------------------------

  注:v1.0版在IE中可能会有些问题,同时异步时出错抛出的异常难以处理。请用v1.1。
9 楼 Liner 2007-07-23  
不了解 MS 的 ActiveXObject,看来真是有些特别
得改一下回调函数的格式约定了,呵呵
function callback(req, id)
{
    if(req.readyState == 4) {
        if(req.status != 200) {
            // do some thing.
            req.onreadystatechange = null;
        }else{
            var _node = document.getElementById(id);
            if(_node) _node.innerHTML = 'Hai ' + req.responseText;

            // clear the reference
            req.onreadystatechange = null;
        }
    }
}

谢谢hax给予如此详细的指正。
8 楼 hax 2007-07-23  
BTW,实际上面还不是最严谨,因为出错的时候也应该置为null。
7 楼 hax 2007-07-23  
 function callback(req, id) {  
     if(req.readyState == 4 && req.status == 200) {  
         var _node = document.getElementById(id);  
         if(_node) _node.innerHTML = 'Hai ' + req.responseText;  

// clear the reference
         req.onreadystatechange = null;

     }  
 }  


注意我加的那句,没有这句,在IE6下会有内存泄漏。
6 楼 Liner 2007-07-21  
hax 写道
1. 应该只使用 msxml2.xmlhttp.6.0和3.0,具体原因请搜索IEBlog。
2. 虽然没有仔细看,不过你的代码很有可能会有内存泄露。。。

不知内存泄漏会出现在哪里?
JS是有内存垃圾收集处理功能的。
可能的一种情况是:因为每次都是创建一个新的请求对象(xhr),返回的对象可能被无限期存储起来而没有释放(一个变量被赋值新的对象,原来的那个值是会进入垃圾处理的)。但这应该是应用的问题了。

>>1. 应该只使用 msxml2.xmlhttp.6.0和3.0,具体原因请搜索IEBlog。
bajax_object的代码是从Sajax.php中拷过来的,没仔细研究。查哈看。。
谢谢
5 楼 hax 2007-07-20  
1. 应该只使用 msxml2.xmlhttp.6.0和3.0,具体原因请搜索IEBlog。
2. 虽然没有仔细看,不过你的代码很有可能会有内存泄露。。。
4 楼 Liner 2007-07-20  
快一个月了,想强化一下Ajax的封装——有“对象池管理”的功能。测试时附带验证这个Bajax的POST操作(以前只是使用GET方法)…………呵呵,大跌眼镜——因为没有设置必要的Header,POST是没有成功的!惨

毕竟只是才学啊,Http的请求模型都没得搞明白 

现在修正Bug,并且接口完全改了:把POST和GET分作2个独立的函数,直接使用更方便。

>>原始内容删除。请查看/下载后面(9楼)的正式版。
3 楼 xieye 2007-06-26  
LZ的照片好难看……
2 楼 Liner 2007-06-25  
呵呵,怎么没人回一哈啊。。。。

自己补充一下:

  我不太清楚IE、Firefox或是其它浏览器申请一个XMLHttpRequest对象的开销有多大?因为每个Ajax请求都是申请一个新的XMLHttpRequest对象。这样做的好处是不存在在全局域管理一个XMLHttpRequest对象池之类的东西,各请求对象之间没有冲突,程序好写。不足之处可能就是会有开销的问题(估计问题不大,毕竟OO就是在使用对象嘛,呵呵)。
  另外,能够传递一个附加的数据到回调函数中,也是一种极大的方便。比如可以传递一个外部容器的Id,或者一个需要用响应数据操作的对象、甚至可以传递一个数组,以用于与服务器响应数据的复杂操作等。

  (创建XMLHttpRequest对象的兼容代码来源于Sajax.php v0.12,在此声明一下。)
1 楼 庄严 2007-06-24  
很好!!!

相关推荐

    Ajax的小封装 get,post请求

    在Web开发中,Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,允许在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。...根据项目需求和浏览器兼容性,可以选择合适的封装方式。

    自己封装的一个ajax的小工具

    4. **兼容性处理**:可能包含了对旧版浏览器的兼容性修复,如XMLHttpRequest对象的版本适配。 5. **错误处理**:提供统一的错误捕获和处理机制。 6. **简单易用**:可能有清晰的API设计,便于开发者快速上手。 在...

    ajax请求后台接口数据与返回值处理js的实例讲解

    在现代开发中,由于jQuery的简便性和跨浏览器的兼容性,$.ajax方法应用更为广泛。 知识点三:$.ajax方法的参数及配置 在上文提供的代码示例中,$.ajax方法有多个配置参数,它们分别代表不同的请求设置和回调函数: ...

    ajax代码及简单封装

    本文将详细解析一个适用于.NET平台的AJAX代码示例及其简单封装方法。 #### 二、核心概念 1. **XMLHttpRequest对象**:在AJAX中扮演着核心角色,负责发送请求和接收响应。 2. **open()方法**:用于设置请求方式...

    ajax.dll以及说明文档和demo

    6. **兼容性和性能优化**: 确保`ajax.dll`与各种浏览器和不同版本的JavaScript兼容,同时关注性能优化,如减少网络延迟、缓存策略等。 **说明文档的价值** 提供的`说明文档`会详细阐述如何正确使用`ajax.dll`,...

    Ajax登陆验证有助于更好的封装

    9. **响应式设计**:考虑到不同设备和浏览器的兼容性,Ajax登录验证的代码应采用响应式设计,确保在各种环境下都能正常工作。 10. **框架与库的应用**:现代开发中,常使用jQuery、Vue.js、React.js等库或框架简化...

    JavaScript封装Ajax

    在实际开发中,除了原生的XMLHttpRequest,还可以使用像Fetch API或者第三方库(如jQuery、axios、fetch-js等)来简化Ajax操作,它们提供了更高级的功能和更好的跨浏览器兼容性。例如,jQuery的`$.ajax()`方法就是一...

    ajax:一个ajax封装实现

    这里的"一个Ajax封装实现"可能就是对`XMLHttpRequest`对象进行了抽象和简化,创建了一个易于使用的函数或类库。 **Ajax的基本流程**: 1. **创建XMLHttpRequest对象**:在所有现代浏览器中,都可以通过`new ...

    ajax设计方案封装库

    【描述】:Ajax封装库的目的是提高开发效率,减少代码冗余,并确保在不同项目中保持一致的接口和行为。它们通常会提供错误处理机制、数据转换功能、支持多种HTTP方法(如GET、POST、PUT、DELETE等)以及兼容性处理,...

    ajaxSubmit_一个封装了上传代码的ajax插件_

    在本篇文章中,我们将深入探讨一个名为"ajaxSubmit"的插件,它是一个专门用于文件上传的工具,极大地简化了前端与后端接口的交互过程。 **ajaxSubmit 插件概述** `ajaxSubmit`是一个基于jQuery的插件,它扩展了...

    prototype的Ajax介绍

    ### Prototype的Ajax介绍 #### 一、Prototype框架与Ajax **Prototype** 是一款JavaScript库,其设计目的是为了简化客户端脚本编程。...此外,框架的安全性和跨浏览器兼容性也为开发者带来了极大的便利。

    Node.js-deft-request是一个轻量级的Javascript浏览器请求框架

    2. **AJAX支持**:对于不支持Fetch的旧版浏览器,deft-request提供了AJAX(异步JavaScript和XML)请求的兼容性。这使得它能在广泛的浏览器环境中运行,确保了向后兼容性。 3. **JSONP支持**:对于需要跨域请求的...

    ajax简单示例和封装库

    这个封装的ajax函数接受URL、请求类型、回调函数和数据作为参数,简化了Ajax的使用。 在压缩包文件"ajax示例和封装库"中,可能包含了这些示例代码和封装好的Ajax库,可以直接在项目中使用,以提高开发效率。只需...

    第34章 项目1-博客前端:封装库--引入Ajax1

    以下是一个简单的Ajax封装示例: ```javascript function ajax(obj) { var xhr = (function () { if (typeof XMLHttpRequest != 'undefined') { return new XMLHttpRequest(); } else if (typeof ActiveXObject...

    json ajax ajax框架

    7. **兼容性考虑**:对于老版本的浏览器,可能不支持XMLHttpRequest或新的JavaScript特性,因此需要使用polyfill或选择兼容性更好的库。 通过理解JSON、AJAX及其框架的工作原理和最佳实践,开发者可以构建出更加...

    ajax无刷新上传图片

    在现代Web应用中,"Ajax无刷新上传图片"是一个常见的需求,它允许用户在不刷新整个页面的情况下上传图片,提供更好的用户体验。这个功能通常通过结合使用JavaScript库jQuery和特定的Ajax上传插件来实现,例如这里...

    js实现的弹窗效果,兼容主流浏览器

    在实际项目中,可以封装一个弹窗函数或类,以参数形式接收内容、类型、回调等,这样可以方便地在页面各处复用。例如: ```javascript function showDialog(message, type, callback) { // 创建弹窗,设置样式和...

    ASP.NET2.0实现无刷新客户端回调的Callback机制

    4. 兼容性:并非所有浏览器都支持AJAX,需要确保应用对不支持AJAX的浏览器提供备选方案。 5. 代码组织:为了保持代码的清晰和可维护性,可以将AJAX逻辑封装在单独的代码文件或用户控件中。 在"WebSiteTest"这个...

    一个简单实用的ajax"类"

    7. **兼容性处理**:考虑到老旧浏览器可能不支持`XMLHttpRequest`,`ajax.js`可能包含了对`ActiveXObject`(Internet Explorer的老版本支持)的检查,以确保在所有浏览器中都能正常工作。 8. **回调函数**:为了...

    js 回调函数

    这种方法假设你需要为你的回调函数使用不同的签名,例如 Ajax.Net 的专家们允许你在回调中使用额外的参数,如果你想从一个换到另外一个并且保持兼容性的话,就要用到下面的写法: 方法四:使用匿名函数 第四种办法...

Global site tag (gtag.js) - Google Analytics