树型菜单可以说是项目中应用最为广泛的运用。以前无论使用微软控件的树型,还是比较优秀的阿赖树型,都是将数据全部读出,然后再分级显示。这样如果数据量大,那么第一次显示将需要客户等待很长一段时间,降低了客户的体验度。如今使用ajax,事情变得简单了。
此运用参考了《征服web2.0开发技术详解》的例子。
我使用的平台是struts+spring+hibernate,但与ajax打交道的也就是struts。我无法将整个代码贴出来,因此把重要的前台ajax代码贴出来,至于后台的代码就看你自己所使用的技术了。
1、jsp页面
<% @pagelanguage = " java " contentType = " text/html;charset=GB2312 " import = " java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb " %>
< html >
< head >
< title > Inserttitlehere </ title >
< linkrel = " stylesheet " href = " ../css/tree.css " >
<scripttype="text/javascript"src="../js/tree_htfl.js"></script>
<scriptlanguge="javascript">
functionShowDetail(ID,NAME,FLAG){
window.parent.right.location="getContract.go?method=doGetContract&folderID="+ID+"&&folderName="+NAME+"&&flag="+FLAG;
}
</script>
</head>
<bodybgcolor="#F6F9FF">
<tbody>
<tablecellpadding="0"cellspacing="0"width="300">
<divid="load"style="display:none"><imgsrc="../images/tree_loading.gif">Loadingdata..</div>
<ulclass="tree">
<%ListtreeList=(List)request.getAttribute("treefolder");
Iteratorit=treeList.iterator();
while(it.hasNext()){
out.println(it.next().toString());
}
%>
</table>
</tbody>
</body>
</html>
2、tree_htfl.js 代码
functionshowHide(id)
{
varel=document.getElementById(id);
varbExpand=true;
varimages=el.getElementsByTagName("IMG");
if(images[0].src.indexOf("tree_minus.gif")!=-1)
{
bExpand=false;
images[0].src="../images/tree_plus.gif";
}else{
images[0].src="../images/tree_minus.gif";
}
varsubs=el.lastChild;
if(bExpand)
subs.style.display="block";
else
subs.style.display="none";
}
functiongetSubTree(id,submitURL)
{
varsubmitURL=submitURL
postXmlHttp(submitURL,'parseSubTree("'+id+'")','load("'+id+'")');
}
functionparseSubTree(id)
{
varel=document.getElementById(id);
varulElmt=document.createElement("UL");
ulElmt.innerHTML=_xmlHttpRequestObj.responseText;
el.appendChild(ulElmt);
varimages=el.getElementsByTagName("IMG");
images[0].setAttribute("src","../images/tree_minus.gif");
images[0].setAttribute("onclick",newFunction("showHide('"+id+"')"));
varaTag=el.getElementsByTagName("A");
aTag[0].setAttribute("onclick",newFunction("showHide('"+id+"')"));
varloadDiv=document.getElementById("load");
loadDiv.style.display="none";
}
functionload(id)
{
varloadDiv=document.getElementById("load");
loadDiv.style.display="block";
}
var_postXmlHttpProcessPostChangeCallBack;
var_xmlHttpRequestObj;
var_loadingFunction;
functionpostXmlHttp(submitUrl,callbackFunc,loadFunc)
{
_postXmlHttpProcessPostChangeCallBack=callbackFunc;
_loadingFunction=loadFunc;
if(window.createRequest)
{
try{
_xmlHttpRequestObj=window.createRequest();
_xmlHttpRequestObj.open('POST',submitUrl,true);
_xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
_xmlHttpRequestObj.send();
}
catch(ee){}
}
elseif(window.XMLHttpRequest)
{
_xmlHttpRequestObj=newXMLHttpRequest();
_xmlHttpRequestObj.overrideMimeType('text/xml');
_xmlHttpRequestObj.open('POST',submitUrl,true);
_xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
_xmlHttpRequestObj.send("");
}
elseif(window.ActiveXObject)
{
_xmlHttpRequestObj=newActiveXObject("Microsoft.XMLHTTP");
_xmlHttpRequestObj.open('POST',submitUrl,true);
_xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
_xmlHttpRequestObj.send();
}
};
functionpostXmlHttpProcessPostChange()
{
if(_xmlHttpRequestObj.readyState==4)
{
if(_xmlHttpRequestObj.status==200){
setTimeout(_postXmlHttpProcessPostChangeCallBack,2);
}else{
alert(_xmlHttpRequestObj.status);
}
}
if(_xmlHttpRequestObj.readyState==1)
{
setTimeout(_loadingFunction,2);
}
}
3、action代码
/***//**
*展开第一层目录
*/
publicActionForwarddoGetFolderList(
ActionMappingmapping,
ActionFormform,
HttpServletRequestreq,
HttpServletResponseres){
Listlist=treeCatalogService.getChildren("0");
ListTreeFolder=newArrayList();
Iteratorit=list.iterator();
while(it.hasNext()){
TbJyhtflbhtfl=(TbJyhtflb)it.next();
Strings=treeCatalogService.renderTreeViewAjax(htfl);
TreeFolder.add(s);
}
req.setAttribute("treefolder",TreeFolder);
returnmapping.findForward("foldertree");
}
/***//**
*展开下级目录
*/
publicActionForwarddoGetSubFolderList(
ActionMappingmapping,
ActionFormform,
HttpServletRequestreq,
HttpServletResponseres){
StringparentID=req.getParameter("parentID");//获得id的值
if(parentID!=null&&!parentID.equals("")){//如果不为null和空
res.setContentType("text/html;charset=GB2312");
Listlist=treeCatalogService.getChildren(parentID);
Iteratorit=list.iterator();
try{
PrintWriterout=res.getWriter();
while(it.hasNext()){
TbJyhtflbhtfl=(TbJyhtflb)it.next();
out.println(treeCatalogService.renderTreeViewAjax(htfl));
}
out.close();
}catch(Exceptione){
e.printStackTrace();
}
}
returnnull;
}
4、service层代码
/***//**
*函数说明:展开目录
*参数说明:目录对象
*返回值:展开目录的HTML代码
*/
publicStringrenderTreeViewAjax(TbJyhtflbhtfl){
StringBuffercontent=newStringBuffer();
StringID=htfl.getTbJyhtflbZlId();
StringNAME=htfl.getTbJyhtflbMc();
StringFLAG=htfl.getTbJyhtflbLb();
content.append("<liid='"+ID+"'>");
if(treeCatalogDAO.canExpand(ID))
content.append("<imgsrc=../images/tree_plus.gifonClick=/"getSubTree('"+ID+"')/">");
else
content.append("<imgsrc=../images/tree_blank.gif>");
content.append("<imgsrc=../images/tree_folder.gif><ahref=/"javascript:ShowDetail('"+ID+"','"+NAME+"','"+FLAG+"')/"");
if(treeCatalogDAO.canExpand(ID)){
StringsubmitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
content.append("onClick=/"getSubTree('"+ID+"',submitURL)/"");
}
content.append(">"+NAME+"</a>");
content.append("</li>");
returncontent.toString();
}
5、tree.css代码:
p{
font-family:arial;
}
a{
color:#000;
font-family:arial;
font-size:0.8em;
}
.tree{
margin:0px;
padding:0px;
}
.treeul{/**//*子结点*/
margin-left:20px;/**//*Leftspacing*/
padding-left:0px;
}
.treeli{/**//*结点*/
list-style-type:none;
vertical-align:middle;
}
.treelia{/**//*结点连接*/
color:#000;
text-decoration:none;
font-family:arial;
font-size:0.8em;
padding-left:2px;
}
代码基本就是这样了,希望对大家有用。
分享到:
相关推荐
在本文中,我们将深入探讨Ajax动态树型菜单的原理、实现方法以及相关技术。 首先,我们需要理解Ajax的核心理念。Ajax允许网页部分内容的异步更新,通过后台与服务器交换数据并局部更新页面,而无需用户手动刷新。这...
【标题】"精美的ajax树型菜单" 描述了一个利用AJAX技术实现的交互式树状菜单,这种菜单设计能够提供动态加载数据的功能,提升用户体验。在网页设计中,树型菜单通常用于组织大量层级结构的数据,使得用户可以便捷地...
本项目涉及的是如何利用Ajax技术构建一个动态的树型菜单,这在Web应用程序中非常常见,尤其是在管理和导航复杂的多层级数据时。在JSP(JavaServer Pages)环境中,我们可以结合Ajax和Java后端来实现这一功能。 首先...
总的来说,"JSP+Ajax无刷新树型菜单数据库版"是一个结合了前后端技术的实例,展示了如何利用JSP构建用户界面,通过Ajax实现动态数据加载,同时利用SQL管理数据库,从而提供了一个高效、交互性强的树型菜单系统。...
"php ajax树型菜单 Tree菜单实例" 提供了一种使用PHP和AJAX技术实现的动态树形菜单解决方案,特别适合于内容管理系统(CMS)中,以便用户能够便捷地浏览和操作多层次的页面或功能。 PHP是一种广泛使用的服务器端...
在本项目中,我们将探讨如何使用Ajax、Struts2框架以及Dojo库来动态地从数据库中获取数据并生成树型菜单。这个功能常见于网站的导航系统,允许用户以层级结构浏览和操作数据。 首先,`Ajax`(Asynchronous ...
综合运用这些技术和文件,开发者可以构建出一个动态的、数据库驱动的JSP+Ajax无刷新树型菜单,提供高效且用户友好的界面。这个方案适用于需要展示层次结构数据的Web应用程序,如文件管理系统、组织架构展示或权限...
本项目利用这两种技术实现了一个动态的树型菜单,它具有选择功能、动态加载和一次性加载所有节点的能力。接下来,我们将深入探讨这些概念和技术。 1. **JavaScript**:JavaScript 是一种广泛使用的客户端脚本语言,...
现代Web应用需要考虑不同设备和屏幕尺寸,树型菜单的AJAX实现也需要适应这些变化。可能需要调整节点的布局、展开收缩的交互方式,以保证在手机和平板等移动设备上的良好体验。 9. **安全性与兼容性** 在实现过程...
总的来说,无限级可刷新Js树型菜单的实现涉及JavaScript基础、数据结构、DOM操作、事件处理、异步通信等多个知识点,需要结合实际应用场景灵活运用。通过熟练掌握这些技能,开发者可以创建出高效、用户友好的前端...
Ajax(Asynchronous JavaScript and XML)技术的引入,使得树型菜单能够实现动态加载,提高用户体验,避免一次性加载大量数据导致页面响应变慢。下面将详细解释"树型菜单Ajax动态载入"这一主题。 首先,树型菜单是...
树型菜单是一种常见的用户界面元素,特别是在计算机软件和网页设计中。它以树状结构来组织数据,模拟了现实世界...通过学习和应用这个库,开发者可以轻松地在自己的项目中集成功能丰富的树型菜单,提高用户的导航效率。
本文将深入探讨如何利用Ajax实现一个无限树型菜单,以及相关的核心知识点。 一、Ajax基础 Ajax的核心是通过JavaScript与服务器进行异步通信,它主要包括以下组件: 1. XMLHttpRequest对象:负责与服务器建立HTTP...
在这个“经典的js树型菜单”示例中,我们将深入探讨如何使用JavaScript来创建一个可展开和折叠的树状菜单。 树型菜单在网站导航中非常常见,它可以帮助用户组织和浏览大量的层次结构信息。通过JavaScript,我们可以...
在Java环境中,你可以利用Ajax技术与服务器端进行通信,获取并更新树型菜单的数据。Xtree还支持拖放操作,使得用户能够方便地重新排列菜单结构。 在Java Web项目中集成这些JavaScript库,你需要在HTML页面中引入...
这个“AJAX+XML实现的树型菜单”示例是AJAX技术的一个经典应用,主要用于提升用户体验,通过异步加载数据来构建交互式的树状导航结构。 首先,我们要理解AJAX的基本工作原理。它通过JavaScript创建XMLHttpRequest...
动态树型目录是Ajax技术的一种常见应用,通常用于文件管理系统、组织结构展示或者网站导航菜单等场景。 在“Ajax动态树型目录”中,我们首先需要理解树型目录的概念。树型目录是一种层次化的结构,模拟了现实中文件...
树型菜单则是在树型结构基础上,用于网站或应用的导航组件。它允许用户逐级浏览和选择,尤其适用于具有多层级分类的系统,如文件管理系统、组织结构图或者网站导航栏。 实现"js动态树型结构 树型菜单"通常需要以下...
在dwnTree中,Ajax被用来异步地获取并加载树型菜单的子节点,这意味着只有当用户展开一个节点时,其子节点才会被加载,降低了初次加载时的数据量和时间成本。 此外,“可记忆”的特性是dwnTree的一大亮点。这意味着...
在“ASP产品三级(多级)分类数据库版与树型菜单动态非数据库版.2014.06”这个压缩包中,很可能包含了一个基于ASP技术的多级分类系统,配合JavaScript实现的树型菜单展示。这种菜单通常会根据服务器端的数据库数据动态...