JS实现树形选择器

本文介绍了一个基于jQuery的树形插件实现方法,重点讲解了如何通过该插件实现节点的状态检查、获取已选中节点及未确定状态节点等功能,并提供了详细的代码示例。

(function ($) {
 $.extend($.tree.callback,{
  /*CheckNode状态改变以后,回调函数*/
  oncheckchanged:function(NODE,TREE_OBJ){
   return true;
  }
 });

 $.extend($.tree.plugins, {
  "checkbox" : {
   defaults : {
    three_state : true
   },
   get_checked : function (t) {
    if(!t) t = $.tree.focused();
    return t.container.find("a.checked").parent();
   },
   get_undeterminded : function (t) {
    if(!t) t = $.tree.focused();
    return t.container.find("a.undetermined").parent();
   },
   get_unchecked : function (t) {
    if(!t) t = $.tree.focused();
    return t.container.find("a:not(.checked, .undetermined)").parent();
   },

   check : function (n) {
    if(!n) return false;
    var t = $.tree.reference(n);
    n = t.get_node(n);
    if(n.children("a").hasClass("checked")) return true;

    var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
    if(opts.three_state) {
     n.find("li").andSelf().children("a").removeClass("unchecked undetermined").addClass("checked");
     n.parents("li").each(function () {
      if($(this).children("ul").find("a:not(.checked):eq(0)").size() > 0) {
       $(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
       return false;
      }
      else $(this).children("a").removeClass("unchecked undetermined").addClass("checked");
     });
    }
    else n.children("a").removeClass("unchecked").addClass("checked");
    t.callback("oncheckchanged", [n,t]);
    return true;
   },
   uncheck : function (n) {
    if(!n) return false;
    var t = $.tree.reference(n);
    n = t.get_node(n);
    if(n.children("a").hasClass("unchecked")) return true;

    var opts = $.extend(true, {}, $.tree.plugins.checkbox.defaults, t.settings.plugins.checkbox);
    if(opts.three_state) {
     n.find("li").andSelf().children("a").removeClass("checked undetermined").addClass("unchecked");
     n.parents("li").each(function () {
      if($(this).find("a.checked, a.undetermined").size() - 1 > 0) {
       $(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
       return false;
      }
      else $(this).children("a").removeClass("checked undetermined").addClass("unchecked");
     });
    }
    else n.children("a").removeClass("checked").addClass("unchecked");
    t.callback("oncheckchanged", [n,t]);
    return true;
   },
   toggle : function (n) {
    if(!n) return false;
    var t = $.tree.reference(n);
    n = t.get_node(n);
    if(n.children("a").hasClass("checked")) $.tree.plugins.checkbox.uncheck(n);
    else $.tree.plugins.checkbox.check(n);
   },
   get_nodestate :function(n){
    if(!n) return false;
    var t = $.tree.reference(n);
    n = t.get_node(n);
    return n.children("a").hasClass("checked");
   },
   callbacks : {
    onchange : function(n, t) {
     $.tree.plugins.checkbox.toggle(n);
    }
   }
  }
 });
})(jQuery);

带选择框的JS树控件 页面创建一个HTMLElement是很耗时的,无论使用createElement或者是是innerHTML都一样。 而且这一步只能一个节点一个节点慢慢地生成,虽然可以通过减小单个节点的HTML元素量的方法提高一些速度,但是对于对于上千个节点来说仍然需要等上几十秒。 (1个节点如果有5个HTMLElement,生成1000个节点大概3秒左右) 所以只有通过异步展示的方法来进一步减少一次生成的节点数。 页面加载时并不立即生成所有节点的HTML元素,而是用户展开多少节点就生成多少节点,节点的生成发生在用户展开这个节点的时候。 这样减少了每次生成的节点数,消除了使用者的等待时间。 而对于节点的检索,这和数据的组织方式有关。 一般的组织方式是使用数组。(解析XML的话太慢,不考虑。只考虑使用json的情况) 但是在数组中检索一个节点的效率实在不敢恭维,如果节点是N个,那么全部节点数据组装起来的效率就是N*N 在节点少的时候不明显,但是如果有1000个节点,那么明显会发觉延迟了10多秒。延迟速度按指数增加。 MzTree(梅花雪)使用了另外一种方式,他没有使用数组而是使用一个简单对象来存放数组。 并且用一个字符串存放节点的索引关系(将所有的节点名(即类的属性名)join()成一个大字符串) 当需要获得子节点的时候使用正则匹配一步获得子节点ID,从而获得子节点。 经过测试发现,使用正则匹配的算法检索节点效率比使用for循环要高出很多。 这个效率已经满足一般大数据jstree的需要。 (具体算法,去参考MzTree梅花雪)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值