文件名: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;
}