經過jstree展現一個樹形結構的時候,當我針對一個結點的父節點刷新的時候,那麼,當前選中的節點的選中狀態不存在了,緣由在於:刷新後dom的節點信息,是從新生成的了。 node
開始採用的代碼: ajax
// $parentNode 父親節點 // $currentNode 當前節點,在刷新以前記錄此信息 ("#jstree").jstree('refresh', $parentNode); // 經過查詢dom元素,每一個結點的信息,是經過li下的a添加樣式完成 $currentNode.find('a').addClass('jstree-clicked');
如上代碼,除了存在元素找不到的狀況,還有一個問題: 服務器
對於refresh操做,是經過ajax完成對服務器的請求,這個時候,請求發出去後,就繼續執行接下來的語句了。 dom
其實,若是咱們採用jQuery的ajax操做後,咱們發現,其實在請求完畢,習慣有一個callback來繼續操做。如此,觀察到refresh的操做,在請求前,記錄刷新前結點的狀態(如,展開狀態),請求後,再次還原刷新前狀態,如此看來,其實在jstree的refresh中,應該存在一個callback,可是從官方的文檔中,沒有看到這個參數。 this
查看源碼:(代碼527行位置) spa
refresh : function (obj) { var _this = this; this.save_opened(); if(!obj) { obj = -1; } obj = this._get_node(obj); if(!obj) { obj = -1; } if(obj !== -1) { obj.children("UL").remove(); } else { this.get_container_ul().empty(); } this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes();}); }
正如,上面所猜想的,在執行load_node的時候,執行了一個callback的方法。對上面的代碼調整,添加一個參數的callback,而且在加載完成節點信息後,執行此方法。看代碼: code
refresh : function (obj, cbk) { var _this = this; this.save_opened(); if(!obj) { obj = -1; } obj = this._get_node(obj); if(!obj) { obj = -1; } if(obj !== -1) { obj.children("UL").remove(); } else { this.get_container_ul().empty(); } this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); cbk && cbk();}); }
對開始的代碼,調整爲: rem
// $parentNode 父親節點 // $currentNode 當前節點,在刷新以前記錄此信息 ("#jstree").jstree('refresh', $parentNode, function() { // 經過查詢dom元素,每一個結點的信息,是經過li下的a添加樣式完成 $currentNode.find('a').addClass('jstree-clicked'); });
如上,咱們解決了,在服務器請求完畢後,對節點的信息再調整的一個功能。 文檔