前面已经对dhtmlx的东西有所介绍,使用中也发现了不少bug。 最近在用dhtmlxtree做一个服务器端文件目录浏览与下载的模块是发现一个bug;先说说问题,哈!
由于服务器端供浏览和打包下载的文件和文件夹都很多,一次都加载所有的树节点很费时,只得异步加载,也就是点击节点前面的展开图标时加载该节点下的子节点;但这个时候问题出来了,我的要求是点击展开图标的时候不触发节点的点击事件,只是去加载子节点;但是使用dhtmlxtree时,点击展开图标,这两个事件都触发了,子节点可以展开,但是点击事件触发的时候获取的只能是最后一个子节点的ID。没办法只能自己动手改dhtmlxtree的源码了。
修改的思路是这样子的,加一个判断,判断触发树节点点击事件时获得的ID是否和选中的树节点ID相同,也就是说点击树节点触发点击事件时这个节点肯定是被选中的,但是点击展开图标触发加载子节点事件时它自己的节点不会被选中。
具体对dhtmlxtree.js简单修改如下:
1.修改_selectItem函数,添加判断。
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方法
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. 添加方法
//daoger 2009-08-05 start
dhtmlXTreeObject.prototype.getFileTreeNowId = function () {
return this.fileTreeNowId;
};
//daoger 2009-08-05 end
4.修改_loadDynXML函数:
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时才进行操作。
分享到:
相关推荐
dhtmlxTree代码,通过加载后台XML组建树结构,前台使用JS加载
近来因项目需要,研究了一下dhtmlxtree,发现网上例子比较少,尤其是比较完整的例子。把自己做的demo整理了一下,上传上来,大家共享一下,欢迎提出改进意见。[转载]
圣诞节到了,我为大家送上java版的纯json数据构建树的demo,嘻嘻有了这个demo想建多少棵圣诞树也不是问题!送给各位位辛勤劳动的软件工程师们,祝大家圣诞快乐,新年快乐!身体健康,事业有成哦!
dhtmlXtree树 右dhtmlXtree键菜单
通过开发一个小工具讲述DHtmlXTree的应该 主要内容: DHtmlXTree生成设置 xml文档生成 DHtmlXTree加载xml文档
dhtmlxtree和json的应用。自己写的练习项目,免费下载。
专业版dhtmlxtree下载 专业版dhtmlxtree下载
dhtmlxtree例子
博文链接:https://clarancepeng.iteye.com/blog/108163
dhtmlx公司的系列组件包括以下几个,此处只上传的是其中的树控件: 包含dhtmlxTree(树型控件),dhtmlxTabbar(选项卡),dhtmlxGrid(数据表格),dhtmlxCombo(下拉选项),dhtmlxTreeGrid(树型表格),dhtmlxVault(文件上传控件...
dhtmlxLayout是一个 JavaScript的DHTML的 组成部分,它提供了强大而有效的方式来建立 Ajax的Web界面 轻松。 该组件允许您以编程定义界面结构,包括大小元素及其布局。 最终用户可以轻松地调整,倒塌或扩大这些界面...
简单的Dhtmlxtree的运用,树是通过xml加载成的。
dhtmlxtree中文开发指导,简单介绍dhtmlxtree的使用。初学者适合。
dhtmlxTree 树形控件 JavaScript
dhtmlXTree1.6,js实现的树结构的目录
第三方树控件dhtmlxTree 3.6
dhtmlxtree实例包括复选、右键菜单、拖拽等功能