运用ajax技术的树型菜单

导读:
  JAVA涂鸦
  posts - 46, comments - 406, trackbacks - 0
  树型菜单可以说是项目中应用最为广泛的运用。以前无论使用微软控件的树型,还是比较优秀的阿赖树型,都是将数据全部读出,然后再分级显示。这样如果数据量大,那么第一次显示将需要客户等待很长一段时间,降低了客户的体验度。如今使用ajax,事情变得简单了。
  此运用参考了《征服web2.0开发技术详解》的例子。
  我使用的平台是struts+spring+hibernate,但与ajax打交道的也就是struts。我无法将整个代码贴出来,因此把重要的前台ajax代码贴出来,至于后台的代码就看你自己所使用的技术了。
  1、jsp页面
  <%@?page?language="java"?contentType="text/html;?charset=GB2312"?import="java.util.*,com.wehave.oa.cecontract.model.TbJyhtflb"%> Insert?title?here?rel="stylesheet"?href?=?"../css/tree.css">??<script?type="text/javascript"?src="../js/tree_htfl.js"></script><script?languge="javascript">????function?ShowDetail(ID,NAME,FLAG){
  window.parent.right.location?="getContract.go?method=doGetContract&folderID="?+ID?+?"&&folderName="+NAME+"&&flag="+FLAG;
  }</script> ? ? Loading?data.. <%??List?treeList?=?(List)request.getAttribute("treefolder");
  Iterator?it=treeList.iterator();
  while(it.hasNext()){
  out.println(it.next().toString());
  }%>
  2、tree_htfl.js 代码
  function?showHide(?id?){
  var?el=?document.getElementById(?id?);
  var?bExpand?=?true??var?images?=?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"??}??var?subs=el.lastChild;
  if(bExpand)
  subs.style.display="block"??else????subs.style.display="none"}function?getSubTree(?id?,submitURL){
  var?submitURL=submitURL
  postXmlHttp(?submitURL,?'parseSubTree("'+id+'")'?,'load("'+id+'")');
  }function?parseSubTree(id){
  var?el=?document.getElementById(?id?);
  var?ulElmt=?document.createElement("UL");
  ulElmt.innerHTML=_xmlHttpRequestObj.responseText;
  el.appendChild(ulElmt);
  var?images?=?el.getElementsByTagName("IMG");
  images[0].setAttribute("src",?"../images/tree_minus.gif");
  images[0].setAttribute("onclick",?new?Function("showHide('"+id+"')"));
  var?aTag?=?el.getElementsByTagName("A");
  aTag[0].setAttribute("onclick",?new?Function("showHide('"+id+"')"));
  var?loadDiv=?document.getElementById(?"load"?);
  loadDiv.style.display="none"}function?load(id){
  var?loadDiv=?document.getElementById(?"load"?);
  loadDiv.style.display="block"}var?_postXmlHttpProcessPostChangeCallBack;
  var?_xmlHttpRequestObj;
  var?_loadingFunction;
  function?postXmlHttp(?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){}??}??else?if(window.XMLHttpRequest)
  {
  _xmlHttpRequestObj=new?XMLHttpRequest();
  _xmlHttpRequestObj.overrideMimeType('text/xml');
  _xmlHttpRequestObj.open('POST',submitUrl,true);
  _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
  _xmlHttpRequestObj.send("");
  }??else?if(window.ActiveXObject)
  {
  _xmlHttpRequestObj=new?ActiveXObject("Microsoft.XMLHTTP");
  _xmlHttpRequestObj.open('POST',submitUrl,true);
  _xmlHttpRequestObj.onreadystatechange=postXmlHttpProcessPostChange;
  _xmlHttpRequestObj.send();
  }}function?postXmlHttpProcessPostChange(?){
  if(?_xmlHttpRequestObj.readyState==4)
  {
  if(_xmlHttpRequestObj.status==200){
  setTimeout(?_postXmlHttpProcessPostChangeCallBack,?2?);
  }else{
  alert(_xmlHttpRequestObj.status);
  }??}??if?(?_xmlHttpRequestObj.readyState==1?)
  {
  setTimeout(?_loadingFunction,?2?);
  }}
  3、action代码
  /**?????*?展开第一层目录
  */????public?ActionForward?doGetFolderList(
  ActionMapping?mapping,
  ActionForm?form,
  HttpServletRequest?req,
  HttpServletResponse?res){
  List?list?=?treeCatalogService.getChildren("0");
  List?TreeFolder=new?ArrayList();
  Iterator?it=list.iterator();
  while(it.hasNext()){
  TbJyhtflb?htfl=(TbJyhtflb)it.next();
  String?s=treeCatalogService.renderTreeViewAjax(htfl);
  TreeFolder.add(s);
  }????????req.setAttribute("treefolder",TreeFolder);
  return?mapping.findForward("foldertree");
  }????
  /**?????*?展开下级目录
  */????public?ActionForward?doGetSubFolderList(
  ActionMapping?mapping,
  ActionForm?form,
  HttpServletRequest?req,
  HttpServletResponse?res){
  String?parentID?=?req.getParameter("parentID");?//获得id的值????????if?(parentID!=null&&!parentID.equals("")){?//如果不为null和空????????????res.setContentType("text/html;charset=GB2312");
  List?list?=?treeCatalogService.getChildren(parentID);
  Iterator?it=list.iterator();
  try?{
  PrintWriter?out=?res.getWriter();
  while(it.hasNext()){
  TbJyhtflb?htfl=(TbJyhtflb)it.next();
  out.println(treeCatalogService.renderTreeViewAjax(htfl));
  }????????????????out.close();
  }catch(Exception?e){
  e.printStackTrace();
  }????????}????????return?null????}
  4、service层代码
  /**?????*?函数说明:展开目录
  *?参数说明:?目录对象
  *?返回值:展开目录的HTML代码
  */????public?String?renderTreeViewAjax(TbJyhtflb?htfl)?{
  StringBuffer?content?=?new?StringBuffer();
  String?ID=htfl.getTbJyhtflbZlId();
  String?NAME=htfl.getTbJyhtflbMc();
  String?FLAG=htfl.getTbJyhtflbLb();
  content.append(" ");
  if?(treeCatalogDAO.canExpand(ID))
  content.append(" ");
  else????????????content.append(" ");
  content.append("   if?(treeCatalogDAO.canExpand(ID)){
  String?submitURL="getFolderList.go?method=doGetSubFolderList&parentID="+ID;
  content.append("?onClick=/"getSubTree('"+ID+"',submitURL)/"");
  }????????content.append(">"+NAME+"");
  
  content.append("");
  return?content.toString();
  }
  5、tree.css代码:
  p{
  font-family:arial;
  
  }????a{
  color:#000????????font-family:arial;
  font-size:0.8em;
  }????
  .tree{
  margin:0px;
  padding:0px;
  }????.tree?ul{????/*子结点*/????????margin-left:20px;????/*?Left?spacing?*/????????padding-left:0px;
  }????.tree?li{????/*?结点?*/?
  list-style-type:none;
  vertical-align:middle;
  
  }????.tree?li?a{????/*?结点连接?*/????????color:#000????????text-decoration:none;
  font-family:arial;
  font-size:0.8em;
  padding-left:2px;
  }
  代码基本就是这样了,希望对大家有用。
  千山鸟飞绝评论(33)编辑收藏Ajax
   FeedBack:
  # re: 运用ajax技术的树型菜单
  能共享一下源文件吗?li98311@etang.com非常感谢 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  # re: 运用ajax技术的树型菜单 inber
  希望能看一下你的展示程序,如果可能能发份代码吗:)
  inber520@yahoo.com.cn 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  可以发给我一份源代码吗?多谢了!
  vycon@163.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 千山鸟飞绝
  不知道大家需要的源码是什么,是《征服》里源码吗?
  因为我这是项目中的代码,所以不可能是一个很完整的可以直接copy下来就运行的,但我还是将最重要的代码给贴出来了。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  可否把tree.css的代码发上来?谢谢 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 zJun's帛罗阁
  是怎么构造树的呢?是在tree_ajax.js和tree_htfl.js中吗?哪里可以找到这两个文件呢,这两个文件所有的内容就是文章中提供的js文件的内容吗?最好能提供这两个文件的代码。现在这样看有点摸不着头脑。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 千山鸟飞绝
  我重新修改了一下,提交了tree.css代码。
  另外tree_ajax.js是不需要的,我已经删除。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  把你代码能否共享一下,谢谢
  wuxj888@yahoo.com.cn 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  ccyy978@126.com
  谢谢楼主 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  感谢,研究下先
  service层代码 里边包含了太多的 html 了吧?这样想要修改下样式还要对service里边动刀,感觉不太妥当! 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  dingqf@sttri.com.cn
  谢谢搂住,我要生成个5k个节点的树! 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  ajax没推出之前,也用过这样显示,这样显示的问题是点击展开菜单的时候,如数据量大用户还是要等一段时间。
  而全部读出分级显示只是第一次等待而已,以后则很快。各有利弊吧 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 千山鸟飞绝
  这样显示的问题是点击展开菜单的时候,如数据量大用户还是要等一段时间。
  ================================
  这是数据量相当大才会出现这种情况。如果一个子目录下都有这么多信息,那么整个目录一起读取将会等待多久呢。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 千山鸟飞绝
  service层代码 里边包含了太多的 html 了吧?这样想要修改下样式还要对service里边动刀,感觉不太妥当!
  =============================
  确实是这样,希望大家共同研究。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  《征》作者原来是images[0].setAttribute("onclick", "showHide('"+id+"')")这样写的,是不对的。
  应该是images[0].setAttribute("onclick", new Function("showHide('"+id+"')"))。
  以上大家注意了 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 千山鸟飞绝
  @哈哈哈
  《征》所用的方法适合firefox这类浏览器。而如果要兼容IE浏览器就必须new Function了。
  回复 更多评论
  
  # re: 运用ajax技术的树型菜单 213123
  123123123 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  能否发一下源码  qq522540@gmail.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  可否发一封给我啊,wangguan_xd@126.com。先谢过了! 回复 更多评论
  
  # re: 运用ajax技术的树型菜单[未登录]
  楼主,可否也给我一份代码,树的
  谢谢了
  aprilsuny@163.com 非常感谢!希望你能看到 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 千山鸟飞绝
  因为这是写在项目中的代码,所以无法给大家。
  等下次那天有空,做个单独的DEMO,让大家下载。
  我的这个树是参考了《征服web2.0开发技术详解》书中的例子。大家也可以去看看这本书。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  这个还不错,谢了。不过有没更先进一点的啊。
  如果有,帮忙发过来。yinhui.java@163.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 天路
  谢谢,学习中
  wfjvip@126.com
  请共享一份。 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  好东西,楼主分享一份
  hehua513@163.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  谢谢 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  能否发一份源码?谢谢! sailsoft@tom.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单[未登录]
  楼主,
  能否给我发一份源代码呀?
  我很需要那,,,,,
  希望能得到你的回复,,,,
  先谢谢了。。。。。。
  我的邮箱:wfj587@126.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 守望者
  迫切希望楼主能整理下,共享下!谢谢
  zhouliming-521@163.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单[未登录]
  请发到我邮箱来 frank18@126.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单 创世纪计算机
  这种很不错,现在已经出来好几种了,各有所长~ 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  我也迫切需要 可以的话发我一份 rennuoting@126.com 回复 更多评论
  
  # re: 运用ajax技术的树型菜单
  我也需要 可以的话发我一份 joney_110@163.com 回复 更多评论
  
  标题
  姓名
  主页
  验证码 *
  
  
  内容(请不要发表任何与政治相关的内容)
  
  Remember Me?
  [使用Ctrl+Enter键可以直接提交]
  该文被作者在 2006-08-01 09:13 编辑过
  
  

本文转自
http://www.blogjava.net/rickhunter/articles/59742.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值