由于服务器端供浏览和打包下载的文件和文件夹都很多,一次都加载所有的树节点很费时,只得异步加载,也就是点击节点前面的展开图标时加载该节点下的子节点;但这个时候问题出来了,我的要求是点击展开图标的时候不触发节点的点击事件,只是去加载子节点;但是使用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时才进行操作。