久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    jstree for ajax

     grantbb 2005-07-13
    看到界面程序員用js繪制出各種誘人的界面,實在讓人有些心癢癢。前幾天忍不住自己寫了一個用于展示和操縱樹型數據結構的js對象。
    目標:
    1、高性能,假如樹上有成千上萬的節點,展示的速度應該不會考驗用戶的耐心
    2、使用方便,允許這個對象的使用者能很方便根據對象接口來展示樹型數據、向它增加節點、刪除節點、展開和收縮節點、獲取當前選中節點以及節點上的依附對象、選擇和取消選擇節點
    3、跨平臺,至少能夠在IE以及firefox上運行。

    為了實現這個目標,我提供了2個js對象:Tree和Node,還有一個超類:SkyObject。代碼如下:

    function SkyObject(){
    var id = 0;
    var className = "SkyObject";

    this.getId = function(){
    return id;
    }
    this.setId = function(_id){
    id = _id;
    }
    this.setClassName = function(name){
    className = name;
    }
    this.getClassName = function(){
    return className
    }

    addToContainer(this);

    this.getElement = function(){
    return window.document.getElementById("obj_"+ this.getId());
    }
    }

    var hxdObjPointer = 0;
    var hxdContainer = [];

    function addToContainer(obj){
    obj.setId(hxdObjPointer);
    hxdContainer[hxdObjPointer] = obj;
    hxdObjPointer++;
    }

    function getFromContainer(id){
    return hxdContainer[id];
    }

    function stateClick(id){
    var node = getFromContainer(id);
    node.changeState();
    }

    function nodeClick(id){
    var node = getFromContainer(id);
    node.onSelected();
    var root = node.getRoot();
    var preNodeId = root.getPreNodeId();
    var preNode = getFromContainer(preNodeId);
    if(preNode!=null)
    preNode.onUnSelected();
    }

    function Node(data,parentNode){
    SkyObject.call(this);
    var pNode = parentNode;
    var value = data;
    var state = "closed";
    var children = [];
    this.setClassName("Node");
    var childrenInited = false;

    this.getRoot = function(){
    var current = this;
    var parent = null;
    while(true){
    try{
    parent = current.getParentNode();
    }catch(e){
    }

    if(parent==null || parent=="undefined"){
    return current;
    }else{
    current = parent;
    parent = null;
    }
    }
    }

    this.getParentNode = function() {
    return pNode;
    }

    this.getValue = function(){
    return value;
    }



    this.onSelected = function(){
    var element = window.document.getElementById("namelink_"+this.getId());
    element.style.color="blue";
    var root = this.getRoot();
    root.setCurrentNodeId(this.getId());
    root.onNodeChange();
    }

    this.onUnSelected = function(){
    var element = window.document.getElementById("namelink_"+this.getId());
    if(element!=null)
    element.style.color="black";
    if(this.getId()==root.getCurrentNodeId()){
    var root = this.getRoot();
    root.setCurrentNodeId(-1);
    }
    }



    this.removeChild = function(node){
    if(node==null || node=="undefined")
    return;
    var newChildren = [];
    var index = 0;
    for(var i=0;i<children.length;i++){
    var child = children[i];
    if(node.getId()!=child.getId()){
    newChildren[index] = child;
    index++;
    }
    }

    delete children;
    children = newChildren;

    var element = window.document.getElementById("children_"+this.getId());
    if(element!=null){
    if(children.length>0)
    element.removeChild(node.getElement());
    else
    this.getElement().removeChild(element);
    }
    this.repaint();
    }

    this.addChild = function(node){
    children[children.length] = node;
    var element = window.document.getElementById("children_"+this.getId());

    if(element==null){
    if(value.children!=null && value.children.length>0){
    this.paintChildren();
    element = window.document.getElementById("children_"+this.getId());
    }
    element = window.document.createElement("div");
    element.id="children_"+this.getId();
    this.getElement().appendChild(element);
    }
    state="opened";
    element.style.display = "block";
    node.paint(element);
    this.repaint();
    }



    this.changeState = function(){
    var stateLink = window.document.getElementById("statelink_"+this.getId());
    if(state=="opened"){
    stateLink.innerHTML=" + ";
    state="closed";
    }else{
    state="opened";
    stateLink.innerHTML=" - ";
    }

    var childrenElement = window.document.getElementById("children_"+this.getId());
    if(childrenElement==null){
    if(state=="opened") this.paintChildren();
    }else{
    if(state=="opened"){
    childrenElement.style.display = "block";
    }else{
    childrenElement.style.display = "none";
    }
    }
    }


    this.paintChildren = function(){
    childrenInited = true;
    var nodeElement = this.getElement();
    var childrenElement = null;
    if(value.children!=null && value.children.length>0){
    childrenElement = window.document.createElement("div");
    childrenElement.id="children_"+this.getId();
    for(var i=0;i < value.children.length;i++){
    var childNode = new Node(value.children[i],this);
    children[i]=childNode;
    childNode.paint(childrenElement);
    }
    childrenElement.style.display = "block";
    nodeElement.appendChild(childrenElement);
    }
    }

    this.repaint = function(){
    var statelink = document.getElementById("statelink_"+this.getId());
    var namelink = document.getElementById("namelink_"+this.getId());

    if(children!=null && children.length>0){
    if(state=="opened"){
    statelink.innerHTML=" - ";
    }else{
    statelink.innerHTML=" + ";
    }
    statelink.href=‘javascript:stateClick(‘ + this.getId() +‘)‘;
    }else{
    statelink.innerHTML=" . ";
    }
    namelink.innerHTML = value.name;
    }

    this.paint = function(parent){
    var nodeElement = window.document.createElement("div");
    nodeElement.style.position = "relative";
    nodeElement.id = "obj_"+ this.getId();


    var statelink = window.document.createElement("a");
    statelink.id = "statelink_"+this.getId();
    if(value.children!=null && value.children.length>0){
    if(state=="opened"){
    statelink.innerHTML=" - ";
    }else{
    statelink.innerHTML=" + ";
    }
    statelink.href=‘javascript:stateClick(‘ + this.getId() +‘)‘;
    }else{
    statelink.innerHTML=" . ";
    }

    nodeElement.appendChild(statelink);

    var namelink = window.document.createElement("a");
    namelink.id = "namelink_" + this.getId();
    namelink.href=‘javascript:nodeClick(‘ + this.getId() + ‘)‘;
    namelink.innerHTML = value.name;
    nodeElement.appendChild(namelink);

    if(state=="opened"){
    paintChildren();
    }
    if(parent.type=="nodesPane")
    nodeElement.style.left = 2;
    else
    nodeElement.style.left = 20;
    parent.appendChild(nodeElement);
    }

    }


    function Tree(){

    SkyObject.call(this);
    var children = [];
    var title = "title";
    var element = null;
    var parent = null;
    var value = null;
    var currentNodeId = -1;
    var preNodeId = -1;

    this.setCurrentNodeId = function(id){
    preNodeId = currentNodeId;
    currentNodeId = id;
    }

    this.getPreNodeId = function(){
    return preNodeId;
    }

    this.getCurrentNodeId = function(){
    return currentNodeId;
    }

    this.getCurrentNode = function(){
    if(currentNodeId<0){
    return null;
    }else
    return getFromContainer(currentNodeId);
    }

    this.onNodeChange = function(){};

    this.bindData = function(data){
    value = data;
    }


    this.addChild = function(data){
    var node = new Node(data,this);
    children[children.length] = node;
    var treeElement = this.getElement();
    node.paint(treeElement);
    }

    this.addChildToSelectedNode = function(data){
    var selectednode = this.getCurrentNode();
    var node = new Node(data,selectednode);
    selectednode.addChild(node);
    }



    this.removeChild = function(node){
    var parent = node.getParentNode();
    if(parent.getId()==this.getId()){
    var element = this.getElement();
    element.removeChild(node.getElement());
    var newChildren = [];
    var index = 0;
    for(var i=0;i<children.length;i++){
    var child = children[i];
    if(node.getId()!=child.getId()){
    newChildren[index] = child;
    index++;
    }
    }
    delete children;
    children = newChildren;

    }else{
    parent.removeChild(node);
    }

    }

    this.getElement = function(){
    var nodesPane = window.document.getElementById("obj_"+ this.getId())
    if(nodesPane==null){
    nodesPane = window.document.createElement("div");
    nodesPane.id = "obj_"+this.getId();
    nodesPane.type = "nodesPane";
    if(value!=null && value.length>0){
    for(var i=0;i<value.length;i++){
    var node = new Node(value[i],this);
    children[i] = node;
    node.paint(nodesPane);
    }
    }
    }
    return nodesPane;
    }

    this.paint = function(parent){
    var nodesPane = window.document.createElement("div");
    nodesPane.id = "obj_"+this.getId();
    if(value!=null && value.length>0){
    for(var i=0;i<value.length;i++){
    var node = new Node(value[i],this);
    children[i] = node;
    node.paint(nodesPane);
    }
    }
    parent.appendChild(nodesPane);
    }
    }


    源代碼的確有點長,幸好,對開發者來說,他們不必要了解其中的細節。他們只需要知道有來寫方法可用就行了。下面的代碼是操縱這個組件的示例:
    <script type="text/javascript" src="SigmaTree.js"></script>
    <script language="javascript">
    var tree1 = null;
    var tree2 = null;
    window.onload = function(){
    var roots = {tree:[
    {id:"1",name:"name1",children:
    [

    {id:"10",name:"child0",children:[]},
    {id:"11",name:"child1",children:[]},
    {id:"12",name:"child2",children:[]},
    {id:"13",name:"child3",children:[]},
    {id:"14",name:"child4",children:[]}
    ]
    },

    {id:"2",name:"name2",children:[]},
    {id:"3",name:"name3",children:[]}
    {id:"4",name:"name4",children:[]},
    ]};
    var parent1 = document.getElementById("tree1");
    tree1 = new Tree();
    tree1.bindData(roots.tree);
    tree1.paint(parent1);
    tree1.onNodeChange = function(){

    }
    var parent2 = document.getElementById("tree2");

    tree2 = new Tree();

    tree2.bindData(roots.tree);
    tree2.paint(parent2);

    tree2.onNodeChange = function(){

    }
    }

    function addNew(){
    var nodedata = {id:"123",name:"newNode123"};
    tree1.addChild(nodedata);
    }

    function addNewToSelected(){
    var nodedata = {id:"123",name:"newNode123"};
    tree1.addChildToSelectedNode(nodedata);
    }

    function removeSelectedNode(){
    var node = tree1.getCurrentNode();
    tree1.removeChild(node);
    }
    </script>


    效果:
    1、出色的性能:假如樹上節點分布比較均勻的話,該組件可以輕松在1秒內載入上萬個節點。所謂分布均勻,指的是每個節點的子節點的數量大致相等,比如,頂層節點有100個,每個節點又有100個子節點,那么總共有10000個節點。由于該組件只繪制需要展示的節點,因此剛啟動的時候僅僅繪制了100個頂層節點,所以具有很高的性能。
    2、良好的用戶體驗:頁面可以在不刷新的情況下操縱這棵樹,比如:刪除節點、增加節點、展開和收縮節點。
    3、良好的編程體驗:程序員可以通過bindData() 來綁定一棵js對象組成的樹,并在一個指定的div或者別的什么元素中繪制出這棵樹,向樹增加和刪除節點是非常方便的。編程的便利和普通c/s ide提供的控件相比不遑多讓。如果需要把對樹的操縱持久化到服務器上,程序員可以通過xmlhttp來實現。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 无遮无挡爽爽免费视频| 乱人伦中文字幕成人网站在线| 无码人妻少妇色欲AV一区二区 | 亚洲精品一区二区麻豆| 日韩有码av中文字幕| 无套后入极品美女少妇| 午夜福利精品国产二区| 动漫AV纯肉无码AV电影网| 久久月本道色综合久久| 成 人 在 线 免费观看| 伊人热热久久原色播放WWW| 亚洲欧美成人一区二区在线电影| 久久久亚洲AV波多野结衣| 亚洲AV永久无码精品三区在线 | 亚洲精品日韩中文字幕| 中文字幕亚洲制服在线看| 国产精品普通话国语对白露脸| 国产精品成人影院在线观看| 边做饭边被躁欧美三级| 国产一区二区波多野结衣| 国产明星精品无码AV换脸| 精品无码久久久久成人漫画| 亚洲AV无码专区在线播放中文 | 欧美激情一区二区三区成人 | 国产熟睡乱子伦视频在线播放 | 乱子真实露脸刺激对白| 亚洲精品色午夜无码专区日韩| 欧美日韩中文国产一区发布| 无码日韩av一区二区三区| 日韩V欧美V中文在线| 老色鬼久久亚洲AV综合| 国产成人精品亚洲资源| 国产AV人人夜夜澡人人爽| 日夜啪啪一区二区三区| 国产初高中生真实在线视频| 国产麻豆剧果冻传媒一区| 中文字幕理伦午夜福利片| 亚洲一卡2卡3卡4卡精品| 免费现黄频在线观看国产| 96在线看片免费视频国产| 精品一区二区不卡无码AV|