dhtmlxtree非同期ロード時のバグ修正


先にdhtmlxのものを紹介しましたが、使用中にも多くのバグが見つかりました.最近dhtmlxtreeでサーバー側のファイルディレクトリを閲覧してダウンロードしたモジュールはバグを発見した.まず問題を話してください.
サーバ側が閲覧とパッケージングのためにダウンロードしたファイルとフォルダが多いため、一度にすべてのツリーノードをロードするのは時間がかかり、非同期でロードしなければならない.つまり、ノードの前の展開アイコンをクリックすると、そのノードの下のサブノードをロードする.しかし、この時問題が発生しました.私の要求は展開アイコンをクリックするときにノードのクリックイベントをトリガーせず、サブノードをロードすることです.ただし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をクリックしたときに操作されます.