dhtmlxtree非同期ロード時のバグ修正
3243 ワード
先にdhtmlxのものを紹介しましたが、使用中にも多くのバグが見つかりました.最近dhtmlxtreeでサーバー側のファイルディレクトリを閲覧してダウンロードしたモジュールはバグを発見した.まず問題を話してください.
サーバ側が閲覧とパッケージングのためにダウンロードしたファイルとフォルダが多いため、一度にすべてのツリーノードをロードするのは時間がかかり、非同期でロードしなければならない.つまり、ノードの前の展開アイコンをクリックすると、そのノードの下のサブノードをロードする.しかし、この時問題が発生しました.私の要求は展開アイコンをクリックするときにノードのクリックイベントをトリガーせず、サブノードをロードすることです.ただしdhtmlxtreeを使用する場合、展開アイコンをクリックすると、両方のイベントがトリガーされ、サブノードが展開できますが、イベントがトリガーされたときに取得されるのは最後のサブノードのIDのみです.仕方なく自分でdhtmlxtreeのソースコードを変更するしかありません.
修正の考え方はこのようにして,ツリーノードのクリックイベントをトリガーしたときに得られたIDが選択したツリーノードIDと同じであるか否かを判断する,すなわちツリーノードをクリックしてクリックイベントをトリガーしたときにこのノードは選択されたに違いないが,展開アイコンをクリックしてサブノードイベントをトリガーしたときに自分のノードは選択されない.
具体的にはdhtmlxtree.jsは以下のように簡単に変更されます.
1.修正_selectItem関数、判断を追加します.
2.selectItemメソッドの変更
3.メソッドの追加
4.修正_loadDynXML関数:
5.dhtmlxtreeのノードクリックイベントを呼び出すと、tree.getFileTreeNowId()は、処理関数が入力したidをクリックしたときに操作されます.
サーバ側が閲覧とパッケージングのためにダウンロードしたファイルとフォルダが多いため、一度にすべてのツリーノードをロードするのは時間がかかり、非同期でロードしなければならない.つまり、ノードの前の展開アイコンをクリックすると、そのノードの下のサブノードをロードする.しかし、この時問題が発生しました.私の要求は展開アイコンをクリックするときにノードのクリックイベントをトリガーせず、サブノードをロードすることです.ただし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をクリックしたときに操作されます.