JStree 关联修改

根据业务需求,需要更改JStree源码,以下为记录使用

1.修改选中父级时不自动选中子级,选中子级时直接选中父级并存储父级id

.on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', $.proxy(function (e, data) {
    var obj = data.node,
        m = this._model.data,
        par = this.get_node(obj.parent),
        dom = this.get_node(obj, true),
        i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;

        // apply down
        // if(s.indexOf('down') !== -1) {
            // this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d));
            // for(i = 0, j = obj.children_d.length; i < j; i++) {
            // tmp = m[obj.children_d[i]];
            // tmp.state[ t ? 'selected' : 'checked' ] = true;
            // if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
                //  tmp.original.state.undetermined = false;
                // }
            // }
        // }

        // apply up
        if(s.indexOf('up') !== -1) {
            while(par && par.id !== '#') {
                // c = 0;
                // for(i = 0, j = par.children.length; i < j; i++) {
                    //  c += m[par.children[i]].state[ t ? 'selected' : 'checked' ];
                // }
                // if(c === j) {
                par.state[ t ? 'selected' : 'checked' ] = true;
                if($.inArray(par.id, this._data[ t ? 'core' : 'checkbox' ].selected)==-1){
                    this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id);
                }
                tmp = this.get_node(par, true);
                if(tmp && tmp.length) {
                    tmp.children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked');
                }
                // }
                // else {
                //  break;
                // }
                par = this.get_node(par.parent);
            }
        }

        // apply down (process .children separately?)
        if(s.indexOf('down') !== -1 && dom.length) {
            $(dom.find('.jstree-anchor')[0]).addClass(t ? 'jstree-clicked' : 'jstree-checked');
        }
    }, this))

2.取消选中子级时不取消父级选中状态,不移除选中的父级id

.on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', $.proxy(function (e, data) {
        var obj = data.node,
            dom = this.get_node(obj, true),
            i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;
            if(obj && obj.original && obj.original.state && obj.original.state.undetermined) {
                obj.original.state.undetermined = false;
            }

        // apply down
        if(s.indexOf('down') !== -1) {
            for(i = 0, j = obj.children_d.length; i < j; i++) {
                tmp = this._model.data[obj.children_d[i]];
                tmp.state[ t ? 'selected' : 'checked' ] = false;
                if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
                    tmp.original.state.undetermined = false;
                }
            }
        }

        // apply up
        if(s.indexOf('up') !== -1) {
            // for(i = 0, j = obj.parents.length; i < j; i++) {
                //  tmp = this._model.data[obj.parents[i]];
                //  tmp.state[ t ? 'selected' : 'checked' ] = false;
                //  if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) {
                //      tmp.original.state.undetermined = false;
                //  }
                //  tmp = this.get_node(obj.parents[i], true);
                //  if(tmp && tmp.length) {
                //      tmp.children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
                //  }
            // }
        }
        tmp = [];
        for(i = 0, j = this._data[ t ? 'core' : 'checkbox' ].selected.length; i < j; i++) {
            // apply down + apply up
            if(
                (s.indexOf('down') === -1 || $.inArray(this._data[ t ? 'core' : 'checkbox' ].selected[i], obj.children_d) === -1)
                // &&(s.indexOf('up') === -1 || $.inArray(this._data[ t ? 'core' : 'checkbox' ].selected[i], obj.parents) === -1)
            ) {
                tmp.push(this._data[ t ? 'core' : 'checkbox' ].selected[i]);
            }
        }
        this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(tmp);

        // apply down (process .children separately?)
        if(s.indexOf('down') !== -1 && dom.length) {
            dom.find('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked');
        }
    }, this));

3.jstree初始化时修改父级选中不默认选中子级

.on('model.jstree', $.proxy(function (e, data) {
    var m = this._model.data,
        p = m[data.parent],
        dpc = data.nodes,
        chd = [],
        c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection;

        // if(s.indexOf('down') !== -1) {
        //  // apply down
        //  if(p.state[ t ? 'selected' : 'checked' ]) {
        //      for(i = 0, j = dpc.length; i < j; i++) {
        //          m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true;
        //      }
        //      this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc);
        //  }
        //  else {
        //      for(i = 0, j = dpc.length; i < j; i++) {
        //          if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) {
        //              for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) {
        //                  m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true;
        //              }
        //              this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d);
        //          }
        //      }
        //  }
        // }

        if(s.indexOf('up') !== -1) {
            // apply up
            for(i = 0, j = p.children_d.length; i < j; i++) {
                if(!m[p.children_d[i]].children.length) {
                    chd.push(m[p.children_d[i]].parent);
                }
            }
            chd = $.vakata.array_unique(chd);
            for(k = 0, l = chd.length; k < l; k++) {
            p = m[chd[k]];
            while(p && p.id !== '#') {
                c = 0;
                for(i = 0, j = p.children.length; i < j; i++) {
                    c += m[p.children[i]].state[ t ? 'selected' : 'checked' ];
                }
                if(c === j) {
                    p.state[ t ? 'selected' : 'checked' ] = true;
                    if($.inArray(p.id, this._data[ t ? 'core' : 'checkbox' ].selected)==-1) {
                        this._data[t ? 'core' : 'checkbox'].selected.push(p.id);
                    }
                    tmp = this.get_node(p, true);
                    if(tmp && tmp.length) {
                        // tmp.children('.jstree-anchor').addClass( t ? 'jstree-clicked' : 'jstree-checked');
                    }
                }
                else {
                    break;
                }
                p = this.get_node(p.parent);
            }
        }
    }

    this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected);
}, this))

你可能感兴趣的:(jquery,源码,jstree)