支持ajax的checktree

(function($) {
 //默认往下联动,但是不往上联动
 $.fn.checkTree = function(settings) {//不存在往上联动而不往下联动即不支持withUP=true,widthDown=false的情况
  defaults = $.extend({
   url:'',
   withUp:false,
   withDown:true,
         onExpand: null,//TODO
         onCollapse: null,//TODO
         onCheckChange: null,//TODO checkBox改变事件
         /* Valid choices: 'expand', 'check' */
         labelAction: "check"//TODO
     }, settings);
     var $tree = $(this).find(">ul");
  var $lis = $tree.find('li');
  var $checkboxes = $lis.find("a");
  $tree.liClick();
  $tree.liOverClick(); 
  $tree.checkClick();
 };
 $.fn.checkClick=function(){
  var settings = $.extend({
     }, defaults);
  this.find("a").click(function() {
   var _$$ = $(this);
   //联动上下级
   if(settings.withUp||settings.withDown){
    _$$.toggleClass('unchecked')
     .toggleClass('checked')
      .siblings('ul:first').find("a").attr('class',_$$.hasClass('checked') ? 'checked' : 'unchecked');
    if(!settings.withUp){//不往上联动,那肯定往下联动了
     if(_$$.hasClass('checked')){//被选择的时候
      _$$.children("a").removeClass("unchecked").addClass("checked");
     }else{
      _$$.children("a").removeClass("checked").addClass("unchecked");
     }
    }else{
     if(_$$.hasClass('checked')){//被选择的时候
      _$$.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{//没被选择的时候
      _$$.parents("li").each(function () {
       if($(this).find("a.checked, a.undetermined").size() > 1) {
        $(this).parents("li").andSelf().children("a").removeClass("unchecked checked").addClass("undetermined");
        return false;
       }
       else $(this).children("a").removeClass("checked undetermined").addClass("unchecked");
      });
     }
    }
   }else{//最简单的方式:都不联动
    $(this).toggleClass('unchecked').toggleClass('checked');
   }
   return false;
  });
 }
 $.fn.liClick=function(){
  var settings = $.extend({
     }, defaults);
  this.find('li:has(ul)').addClass('closed').click(function(){
   var ul=$(this).find(">ul");
   $(this).toggleClass('closed').toggleClass('open').slideDown();
   if(ul.hasClass('ajax')){//TODO ajax
    var data="<li class=\"leaf\"><a href=\"#\" class='checked'> <ins>&nbsp;</ins>root node insert</a><ul class=\"ajax\"/></li><li class=\"leaf\"><a href=\"#\"> <ins>&nbsp;</ins>root node insert</a></li><li class=\"last leaf\"><a href=\"#\"><ins>&nbsp;</ins>root node insert</a></li>";
    ul.removeClass("ajax").append($(data));
    ul.liClick();
    ul.liOverClick();    
    ul.checkClick();
    //如果父节点已经被选择,则打开的所有ajax请求的节点都将被选择
    //联动上下级
    if(settings.withUp||settings.withDown){
     if(ul.parent("li").find(">a").hasClass("checked")){
      if(settings.withDown){
       ul.find("a").addClass("checked");
      }
     }else{//否则找到一个被选择的ajax节点,然后点击两次
      ul.find("a.checked:eq(0)").click().click();
     }
    }
   }
   return false;
  });
 }
 $.fn.liOverClick=function(){
  this.find('li:not(:has(ul))').click(function(){//屏蔽没有子元素的节点事件
   return false;
  });
 }
})($);

你可能感兴趣的:(Ajax)