简单实用的ajax脚本

文件名:ajax.js

/**
 * 取得当前页面的url
 * 可以在调用ajax_query前修改
 **/
var url = location.href.substr(0, location.href.length-location.search.length);

/**
 * 给Function对象添加一个取得函数名的方法
 **/
Function.prototype.Name = function() {
  var s = Function.prototype.Name.caller.toString();
  return s.split(/[/r/n]+/)[0].replace(/function/s+(/w+).+/g, '$1');
}

/**
 * 函数 $
 * 功能 获取dhtml对象
 * 参数 e 待查找的对象id或name
 * 返回 成功:对象 失败:null
 */
function $(e) {
  var tag = document.getElementById(e);
  if(tag) return tag;
  tag = document.getElementsByName(e);
  if(tag.tagName == undefined) return null;
  return tag;
}

/**
 * 函数 ajax_query
 * 功能 向服务器发送指令,并处理返回数据
 * 参数
 *   method 服务器端方法名
 *   tag   接受返回数据的dhml对象名,缺省时由服务器决定处理方式
 *   其他  向服务器端传递的其他参数,可缺省
 * 说明 虽然Msxml2.XMLHTTP有着比Microsoft.XMLHTTP更优秀的性能,但是在配置较低的
 *      环境下并不能正常工作。当确认能够正常工作时,再删去注释
 **/
function ajax_query(method, tag) {
 //尝试创建XMLHTTP对象
 var xmlhttp;
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 }catch(e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (oc) {
   xmlhttp = null;
  }
   }
 if(!xmlhttp && typeof XMLHttpRequest != "undefined") {
  var xmlhttp = new XMLHttpRequest(); // Mozilla, Safari, ...
 }
 if(! xmlhttp) {
  alert('错误! 缺少连接组件');
  return;
 }

 if(arguments.length == 0) {
  alert(Function.Name()+'至少需要一个方法名');
  return;
 }

 var data = 'ajax=' + method;
 var i = 1;
 if(tag && $(tag)) {
  data = data + '&ajaxtag=' + tag;
  i++;
 }

 /**
  * 构造参数串
  * 使用了encodeURIComponent函数对参数串进行编码
  * 说明
  *   encodeURIComponent函数是将传入的参数转换成utf-8编码以后再做URL编码,可以在
  *  服务器端自动完成URL解码。注意URL解码后的是utf-8编码的串,需要自行完成到
  *      所需编码的转换
  *   escape函数是将传入的参数转换成unicode编码以后再做URL编码,在服务器端一般不
  *      能全部完成URL解码。参数中的汉字将以%uhhhh的形式出现,处理上稍嫌麻烦
  **/
 for(; i < arguments.length; i++) {
  data = data + '&ajaxargs[]=' + encodeURIComponent(arguments[i]);
 }

 /**
  * 根据参数串的长度确定传输方式
  **/
 var url0 = '';
 var method, post_data;
 if(data.length >= 2048) {
  method = 'POST';
  url0 = url;
  post_data = data;
 }else {
  method = "GET";
  url0 = url + '?' + data;
  post_data = '';
 }

 /**
  * 建立到服务器的连接
  **/
 xmlhttp.open(method, url0, true);

 /**
  * 如果是POST传输方式则设置HTTP头信息
  **/
 if (method == "POST") {
  xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 }

 /**
  * 设置异步模式回调函数
  **/
 xmlhttp.onreadystatechange = function() {
  if (!(xmlhttp.readyState == 4 && xmlhttp.status == 200)) {
   return;
  }
  var xml = xmlhttp.responseXML;
if($('debug') != null) $('debug').value = xml.xml;
  if(xml.xml == '') {
   alert(xmlhttp.responseText);
   return;
  }
  xml = xml.documentElement;
  for(var i=0; i<xml.childNodes.length; i++) {
   var tag = '';
   var data = '';
   /**
    * 只处理XML文档中的action节点
    **/
   if(xml.childNodes[i].nodeName == 'action') {
    /**
     * 如果节点有属性,则取属性值
     * 约定:无论节点有多少属性和是什么名字只认定第一个属性为需要的
     *       这个属性值将作为赋值操作的DHTML对象名
     **/
    if(xml.childNodes[i].attributes.length > 0) {
     tag = xml.childNodes[i].attributes[0].value;
    }
    if(xml.childNodes[i].childNodes.length > 1) {
     /**
      * Firefox需要这样取得CDATA的内容
      **/
     for(var j=0; j<xml.childNodes[i].childNodes.length; j++) {
      if (xml.childNodes[i].childNodes[j].firstChild) {
       data = xml.childNodes[i].childNodes[j].firstChild.data;
      }
     }
    }else if(xml.childNodes[i].firstChild) {
     /**
      * 取得节点的内容
      **/
     data = xml.childNodes[i].firstChild.nodeValue;
    }
    if(tag != '') {
     /**
      * 判断目标对象的种类,并用相应的方式对其赋值
      **/
     if(! (tag = $(tag))) return;
     switch(tag.nodeName) {
      case 'INPUT':
      case 'TEATAREA':
       tag.value = data;
       break;
      default:
       tag.innerHTML = data;
     }
    }else {
     /**
      * 执行规定的动作,data必须是合法的javascript语句
      **/
     try {
      eval(data);
     }catch(e) {}
    }
   }
  }
 }

 /**
  * 发送数据
  **/
 xmlhttp.send(post_data);
 delete xmlhttp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值