EasyUI的tree组件没有提供禁用和激活checkbox的方法,而禁用是很多场景需要用到的。所以在此我通过扩展方法的方式来实现这个功能,之所以选择扩展方法,是为了尽量不改动源码,方便版本升级(本扩展基于1.3.3实现,应该是兼容1.3.0之后所有版本的)。
实现步骤:
修改图标文件:
修改tree组件用到的图标文件,在同一幅图片里增加禁用状态下checkbox的背景图,注意的是,一定是要追加,这样不会对之前的样式有影响,最终我改好的图,如下:
修改样式文件:
修改的图标文件就是为了给新样式使用的,样式文件可以修改easyui.css也可以修改tree.css,如果修改的是后者的话,需要引入tree.css才行,这里拿easyui.css举例,找到"tree-checkbox2"样式的定义,在其下追加三个样式的定义(注意,必须是定义在tree-checkbox2样式后,这样才能覆盖前面的background定义):
- .tree-checkbox-disabled0{
- background: url('images/tree_icons.png') no-repeat -272px -18px;
- }
- .tree-checkbox-disabled1{
- background: url('images/tree_icons.png') no-repeat -272px 0;
- }
- .tree-checkbox-disabled2{
- background: url('images/tree_icons.png') no-repeat -288px 0;
- }
扩展tree组件方法:
- /**
- * tree方法扩展
- * 作者:小雪转中雪
- */
- $.extend($.fn.tree.methods, {
- /**
- * 激活复选框
- * @param {Object} jq
- * @param {Object} target
- */
- enableCheck : function(jq, target) {
- return jq.each(function(){
- var realTarget;
- if(typeof target == "string" || typeof target == "number"){
- realTarget = $(this).tree("find",target).target;
- }else{
- realTarget = target;
- }
- var ckSpan = $(realTarget).find(">span.tree-checkbox");
- if(ckSpan.hasClass('tree-checkbox-disabled0')){
- ckSpan.removeClass('tree-checkbox-disabled0');
- }else if(ckSpan.hasClass('tree-checkbox-disabled1')){
- ckSpan.removeClass('tree-checkbox-disabled1');
- }else if(ckSpan.hasClass('tree-checkbox-disabled2')){
- ckSpan.removeClass('tree-checkbox-disabled2');
- }
- });
- },
- /**
- * 禁用复选框
- * @param {Object} jq
- * @param {Object} target
- */
- disableCheck : function(jq, target) {
- return jq.each(function() {
- var realTarget;
- var that = this;
- var state = $.data(this,'tree');
- var opts = state.options;
- if(typeof target == "string" || typeof target == "number"){
- realTarget = $(this).tree("find",target).target;
- }else{
- realTarget = target;
- }
- var ckSpan = $(realTarget).find(">span.tree-checkbox");
- ckSpan.removeClass("tree-checkbox-disabled0").removeClass("tree-checkbox-disabled1").removeClass("tree-checkbox-disabled2");
- if(ckSpan.hasClass('tree-checkbox0')){
- ckSpan.addClass('tree-checkbox-disabled0');
- }else if(ckSpan.hasClass('tree-checkbox1')){
- ckSpan.addClass('tree-checkbox-disabled1');
- }else{
- ckSpan.addClass('tree-checkbox-disabled2')
- }
- if(!state.resetClick){
- $(this).unbind('click').bind('click', function(e) {
- var tt = $(e.target);
- var node = tt.closest('div.tree-node');
- if (!node.length){return;}
- if (tt.hasClass('tree-hit')){
- $(this).tree("toggle",node[0]);
- return false;
- } else if (tt.hasClass('tree-checkbox')){
- if(tt.hasClass('tree-checkbox-disabled0') || tt.hasClass('tree-checkbox-disabled1') || tt.hasClass('tree-checkbox-disabled2')){
- $(this).tree("select",node[0]);
- }else{
- if(tt.hasClass('tree-checkbox1')){
- $(this).tree('uncheck',node[0]);
- }else{
- $(this).tree('check',node[0]);
- }
- return false;
- }
- } else {
- $(this).tree("select",node[0]);
- opts.onClick.call(this, $(this).tree("getNode",node[0]));
- }
- e.stopPropagation();
- });
- }
- });
- }
- });
代码的实现思路很简单,重现委托事件就可以了,针对click类型的事件,检查节点是否包含禁用样式,然后分别给出不同处理方式。
使用方式:
- //入参可以是节点的ID也可以说节点的target
- $('#tt').tree('disableCheck',"124");//禁用
- $('#tt').tree('enableCheck',"124");//激活
注意:在开启级联勾选的情况下,被禁用的checkbox如果不是叶子节点,可能反映不出其真实状态。
效果演示:
http://www.easyui.info/version/jquery-easyui-1.3.3/demo/tree/disablecheck.html
管理员 世纪之光 : 2013年09月29日18:23:08 地下1层
管理员 世纪之光 : 2013年11月19日11:54:29 地下3层