欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于 Ajax 的无限级菜单

程序员文章站 2022-06-17 13:30:11
支持form的无闪提交(方法有点笨)支持mvc框架,即支持传统网页架构多线程并发请求(要语言支持线程)动态加载文件,只加载有用的!处理了ajax框架臃肿的js文件问题。采用...

支持form的无闪提交(方法有点笨)
支持mvc框架,即支持传统网页架构
多线程并发请求(要语言支持线程)
动态加载文件,只加载有用的!处理了ajax框架臃肿的js文件问题。
采用no table的全div + css布局

a. 获得xmlhttprequest对象,网上到处都找得到了,不多说:

function newxmlhttprequest() {
var xmlreq = false;
if (window.xmlhttprequest) {
xmlreq = new xmlhttprequest();
} else if (window.activexobject) {
try {
xmlreq = new activexobject("msxml2.xmlhttp");
} catch (e1) {
try {
xmlreq = new activexobject("microsoft.xmlhttp");
} catch (e2) {
}
}
}
return xmlreq;
}
这里提供一个通用的支持多浏览器的方法。

b.提出异步请求

 

//这里用bcandy作为方法名是为了感谢一个对我来说很重要的人,她一直在支持我
function bcandy(tid,url,parm,js) {
if(url == ""){
return;
}
//这是一个加载信息提示框,也可以不要!
document.getelementbyid("load").style.visibility = "visible";
//加载相应页面的js文件
if(js != null){
//加载js文件
loadjs(js);
}
// 获取一个xmlhttprequest实例
var req = newxmlhttprequest();
// 设置用来从请求对象接收回调通知的句柄函数
var handlerfunction = getreadystatehandler(req,tid);
req.onreadystatechange = handlerfunction;
// 第三个参数表示请求是异步的
req.open("post", url, true);
// 指示请求体包含form数据
req.setrequestheader("content-type",
"application/x-www-form-urlencoded");
// 发送参数
req.send(parm);
}

function getreadystatehandler(req,tid) {
// 返回一个监听xmlhttprequest实例的匿名函数
return function () {
// 如果请求的状态是“完成”
if (req.readystate == 4) {
// 成功接收了服务器响应
if (req.status == 200) {
//下面一句是重点,这里显示了返回信息的内容部分,也可以加以修改。进行其它处理
document.getelementbyid(tid).innerhtml = req.responsetext;
document.getelementbyid(tid).style.visibility = "visible";
//这一句是实现加载信息提示框的隐藏,也可以不要。
document.getelementbyid("load").style.visibility = "hidden";
} else {
// 有http问题发生
document.getelementbyid("load").style.visibility = "hidden";
alert("http error: "+req.status);
}
}
}
}


//动态加载js文件
function loadjs(file){
var head = document.getelementsbytagname('head').item(0);
var script = document.createelement('script');
script.src = file;
script.type = "text/javascript";
head.appendchild(script);
}
这就是基本的框架了,因为使用了request.responsetext;所以,可以直接请求一个页面jsp,servlet但在使用struts框架的请求时要进行特殊处理,因为form不支持异步请求。建议在这些页面上不要加入<html><body>标签,就像.net里的asxm文件!而且在使用struts框架时有点要注意的是,mapping对象直接返回null就可以了,因为我们会在下面讲到并发多线程。来处理这个问题的。
总的来看,有点像是积木搭建起来的。这样方便文件的修改和扩展,互相之间并不影响,而且,实现了代码和标签分离。在进行传统页面改版时,也不用重新编写全部代码。只要修改一小部分就可以完美实现ajax带来的无闪刷新快感。

以上代码均在ie,firefox下测试过!