dhtmlxtree异步加载时的一个bug修正


前面已经对dhtmlx的东西有所介绍,使用中也发现了不少bug。 最近在用dhtmlxtree做一个服务器端文件目录浏览与下载的模块是发现一个bug;先说说问题,哈!

  由于服务器端供浏览和打包下载的文件和文件夹都很多,一次都加载所有的树节点很费时,只得异步加载,也就是点击节点前面的展开图标时加载该节点下的子节点;但这个时候问题出来了,我的要求是点击展开图标的时候不触发节点的点击事件,只是去加载子节点;但是使用dhtmlxtree时,点击展开图标,这两个事件都触发了,子节点可以展开,但是点击事件触发的时候获取的只能是最后一个子节点的ID。没办法只能自己动手改dhtmlxtree的源码了。

  修改的思路是这样子的,加一个判断,判断触发树节点点击事件时获得的ID是否和选中的树节点ID相同,也就是说点击树节点触发点击事件时这个节点肯定是被选中的,但是点击展开图标触发加载子节点事件时它自己的节点不会被选中。

  具体对dhtmlxtree.js简单修改如下:

  1.修改_selectItem函数,添加判断。

  Javascript代码  

dhtmlXTreeObject.prototype._selectItem = function (node, e) { 
 if (this.checkEvent("onSelect")) { 
 this._onSSCFold = this.getSelectedItemId(); 
 } 
 this._unselectItems(); 
 this._markItem(node); 
 //daoger 2009-08-05 start 
//change the now id when a node is clicked 
 this.fileTreeNowId = this.getSelectedItemId(); 
//daoger 2009-08-05 end 
 if (this.checkEvent("onSelect")) { 
 var z = this.getSelectedItemId(); 
 if (z != this._onSSCFold) { 
  this.callEvent("onSelect", [z]); 
 } 
 } 
}; 

  2.修改selectItem方法

  Javascript代码

dhtmlXTreeObject.prototype.selectItem = function (itemId, mode, preserve) { 
 mode = convertStringToBoolean(mode); 
 var temp = this._globalIdStorageFind(itemId); 
 if ((!temp) || (!temp.parentObject)) { 
 return 0; 
 } 
 if (this.XMLloadingWarning) { 
 temp.parentObject.openMe = 1; 
 } else { 
 this._openItem(temp.parentObject); 
 } 
 var ze = null; 
 if (preserve) { 
 ze = new Object; 
 ze.ctrlKey = true; 
 if (temp.i_sel) { 
  ze.skipUnSel = true; 
 } 
 } 
 if (mode) { 
 this.onRowSelect(ze, temp.htmlNode.childNodes[0].childNodes[0].childNodes[3], false); 
 } else { 
 this.onRowSelect(ze, temp.htmlNode.childNodes[0].childNodes[0].childNodes[3], true); 
 } 
 //daoger 2009-08-05 start 
 //to make sure the item id whether is same after loading the sub nodes of this node from server 
 this.fileTreeNowId = itemId; 
 //daoger 2009-08-05 end 
}; 

  3. 添加方法

  Javascript代码

//daoger 2009-08-05 start 
dhtmlXTreeObject.prototype.getFileTreeNowId = function () { 
 return this.fileTreeNowId; 
}; 
//daoger 2009-08-05 end 

  4.修改_loadDynXML函数:

  Javascript代码   

dhtmlXTreeObject.prototype._loadDynXML = function (id, src) { 
 src = src || this.XMLsource; 
 var sn = (new Date()).valueOf(); 
 this._ld_id = id; 
 //daoger 2009-08-05 start 
 this.fileTreeNowId = id; 
 this.loadXML(src + getUrlSymbol(src) + "uid=" + sn + "&id=" + encodeURI(id)); 
 //this.loadXML(src + getUrlSymbol(src) + "uid=" + sn + "&id=" + id); 
 //daoger 2009-08-05 end 
}; 

  5. 调用dhtmlxtree的节点点击事件时,添加判断当tree.getFileTreeNowId()等于点击处理函数传入的id时才进行操作。



相关阅读:
NFS Server设定
CSS教程:网页版面设计无效的10个原因
HTML表格标记教程(16):标题水平对齐属性ALIGN
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
在 Linux 下如何禁止使用 Ping 命令?
从腾讯网站首页改版学到的几点体会心得
基于jquery的让textarea自适应高度的插件
phpmyadmin 常用选项设置详解版
weblogic 8.1下重新编译java类但不用重启服务器的方法
Oracle实现SQL的递归查询
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
vista系统比较“隐蔽”的删除方法
部署BackupExec Oracle Agent
Ubuntu 7.10下VirtualBox安装及配置方法
快速导航

Copyright © 2016 phpStudy |