Extjs treepanel的ctrl、shift多選、連選功能實現

最近須要實現一個樹的多選連選功能,但發現extjs的多選模型MultiSelectionModel只提供了相似ctrl的多選功能,並無提供shift連選的功能。 網上也沒有關於實現此功能的例子,因而本身重寫了onNodeClick方法,供你們參考。 node

// 存放第一次點擊的節點id
var node1 = null;
var mst=new Ext.tree.MultiSelectionModel({

// 實現ctrl,shift多選 by menglei
onNodeClick : function(n, e) {
 // 獲取該父節點下全部子節點
 var childNodes = n.parentNode.childNodes;
 if (e.shiftKey) {
  if (node1 != null) {
   var v1 = v2 = v3 = 0;
   // 獲取第一次點擊的節點位置
   for (var i = 0; i < childNodes.length; i++) {
    if (childNodes[i].id == node1) {
     v1 = i;
     break;
    }
   }
   // 獲取按shift點擊的節點位置
   for (var i = 0; i < childNodes.length; i++) {
    if (childNodes[i].id == n.attributes.id) {
     v2 = i;
     break;
    }
   }
   // alert('v1:'+v1+" v2:"+v2);
   // 反向選擇
   if (v1 > v2) {
    v3 = v2;
    v2 = v1;
    v1 = v3;
   }
   // 選中當前節點
   this.select(n, e);
   // alert('v1:'+v1+" v2:"+v2);
   // 選擇所選區間內節點
   for (var i = 0; i < childNodes.length; i++) {
    if (i >= v1 && i < v2 + 1) {
     this.select(childNodes[i], e,
     e.shiftKey);
    } else {
     continue;
    }
   }
  } else {
   // 選中當前節點
   this.select(n, e);
   node1 = n.attributes.id;
  }

 } else if (e.ctrlKey) {
  this.select(n, e, e.ctrlKey);
  node1 = null;
 } else {
  // 選中當前節點
  this.select(n, e);
  node1 = n.attributes.id;
 }

}
});
相關文章
相關標籤/搜索