TreeNodeChecked是一个Ext Tree级联选中插件,默认的Ext Tree的Checkbox是不带级联选中功能的,加载TreeNodeChecked插件实现Tree Checkbox的级联选中功能。
演示代码:
new Ext.tree.TreePanel({
...省略部分代码...
plugins: [new Ext.plugin.tree.TreeNodeChecked({
// 级联选中
cascadeCheck: true,
// 级联父节点
cascadeParent: true,
// 级联子节点
cascadeChild: true
// 连续选中
linkedCheck: false,
// 异步加载时,级联选中下级子节点
asyncCheck: false,
// 显示所有树节点checkbox
displayAllCheckbox: false
})]
});
TreeNodeChecked还扩展了两个功能函数:
选中节点
checkNode: function(node, checked)
@param {Object} node 节点ID/TreeNode/Array
@param {Boolean} checked 选中状态
@return void
获取被选中的树叶节点
getLeafChecked : function(p, startNode)
@param {String} p 属性类别
@return Array/String
源代码:
/**
* @author zhangdaipign@vip.qq.com
* @version 1.2.1 (1/4/2010)
*/
Ext.ns('Ext.plugin.tree');
Ext.plugin.tree.TreeNodeChecked = Ext.extend(Object, {
// 级联选中
cascadeCheck: true,
// 级联父节点
cascadeParent: true,
// 级联子节点
cascadeChild: true,
// 连续选中
linkedCheck: false,
// 异步加载时,级联选中下级子节点
asyncCheck: false,
// 显示所有树节点checkbox,设置displayAllCheckbox==true,加载树时,如果node.checked属性为undefined,那么显示一个未选中的checkbox
displayAllCheckbox: false,
constructor: function(config) {
config = config ||
{};
Ext.apply(this, config);
},
init: function(tree) {
if (tree.cascadeCheck === false) {
this.cascadeCheck = this.cascadeParent = this.cascadeChild = this.linkedCheck = this.asyncCheck = false;
}
Ext.apply(tree, {
cascadeCheck: this.cascadeCheck,
cascadeParent: this.cascadeParent,
cascadeChild: this.cascadeChild,
linkedCheck: this.linkedCheck,
asyncCheck: this.asyncCheck,
checkNode: this.checkNode,
getLeafChecked: this.getLeafChecked
});
if (this.cascadeCheck) {
tree.on('checkchange', this.onCheckChange);
}
if (this.cascadeCheck && this.cascadeChild && this.asyncCheck) {
tree.on('expandnode', this.onExpandNode);
}
if (this.displayAllCheckbox) {
var loader = tree.getLoader();
loader.baseAttrs = loader.baseAttrs ||
{};
loader.baseAttrs['checked'] = false;
}
},
// private
onCheckChange: function(node, checked) {
if (!this.cascadeCheck) {
return;
}
var checkChange = function(ui) {
ui.checkbox.checked = checked;
// fix for IE6
ui.checkbox.defaultChecked = checked;
ui.node.attributes.checked = checked;
};
if (this.cascadeParent) {
var loopParentChecked = function(parentNode) {
var pui = parentNode.getUI();
if (!Ext.isDefined(pui.checkbox)) {
return;
}
if (checked) {
checkChange.call(this, pui);
} else {
var c = false;
Ext.each(parentNode.childNodes, function(n) {
if (c || n.id === node.id) {
return;
}
if (n.getUI().checkbox) {
c = n.getUI().checkbox.checked;
}
}, this);
if (!c) {
checkChange.call(this, pui);
}
}
if (Ext.isDefined(parentNode.parentNode)) {
loopParentChecked.call(this, parentNode.parentNode);
}
};
loopParentChecked.call(this, node.parentNode);
}
if (this.cascadeChild) {
var loopChildChecked = function(childNodes) {
if (childNodes.length === 0) {
return;
}
Ext.each(childNodes, function(n) {
var nui = n.getUI();
if (Ext.isDefined(nui.checkbox)) {
checkChange(nui);
loopChildChecked.call(this, n.childNodes);
} else {
if (this.linkedCheck) {
loopChildChecked.call(this, n.childNodes);
}
}
}, this);
};
loopChildChecked.call(this, node.childNodes);
}
},
// private
onExpandNode: function(node) {
if (node.asyncChecked !== true) {
node.asyncChecked = true;
var ui = node.getUI();
if (Ext.isDefined(ui.checkbox)) {
if (ui.checkbox.checked) {
Ext.each(node.childNodes, function(n) {
this.checkNode(n, true);
}, this);
}
}
}
},
/**
* 选中节点
* @param {Object} node 节点ID/TreeNode/Array
* @param {Boolean} checked 选中状态
* @return void
*/
checkNode: function(node, checked) {
if (Ext.isArray(node)) {
Ext.each(node, function(n) {
if (Ext.isString(n)) {
n = this.getNodeById(n);
}
n.getUI().toggleCheck(checked);
}, this);
} else {
if (Ext.isString(node)) {
node = this.getNodeById(node);
}
node.getUI().toggleCheck(checked);
}
},
/**
* 获取被选中的树叶节点
* @param {String} p 属性类别
* @return Array/String
*/
getLeafChecked: function(p, startNode) {
var leafNodes = [], selNodes = this.getChecked(undefined, startNode);
Ext.each(selNodes, function(node) {
if (node.isLeaf()) {
leafNodes.push(node);
}
});
if (!Ext.isDefined(p)) {
return leafNodes;
}
var ret = '';
Ext.each(leafNodes, function(node) {
if (ret.length > 0) {
ret += ',';
}
ret += (p == 'id' ? node.id : node.attributes[p]);
});
return ret;
}
});
更新日志:
v1.2.1 1/4/2010
1. 修正checkNode方法bug
2. 新增displayAllCheckbox属性,显示所有树节点checkbox
v1.2 10/3/2010
1. 新增asyncCheck属性,异步加载时,级联选中下级子节点
分享到:
相关推荐
在element-ui中的el-tree上实现单独拉出一棵树来显示树的选中节点,同时可以在该树上删除已选中节点
AJAX-DWR下拉框级联AJAX-DWR下拉框级联 真正实用的`仅供参考
纯JS+HTML写的checkBox Tree 级联选中 好用无BUG 1 选上级,自动选下级 2 选下级,自动选上级 在网上找的其他例子,都有BUG,本程程序绝对可用,放心下载!
2020-06 iview级联选择器-省市区三级联动js文件下载 2020-06 iview级联选择器-省市区三级联动js文件下载
纯JS---省份城市级联选择, (this);" style="width: 49%; float: left;"> ; float: right;"></select>
DirectX11 With Windows SDK--38 级联阴影贴图(CSM).doc
行业分类-设备装置-一种级联式储能变流器检测平台及其控制方法.zip
人工智能-机器学习-基于目标级联法和智能优化算法的车间调度问题研究.pdf
Brocade-光纤交换机级联及划分ZONE.doc
Excel表格+Word文档各类各行业模板-建立复杂级联菜单.zip
hibernate many-to-many级联保存,级联更新,级联删除
Brocade-光纤交换机级联及划分ZONE.docx
行业资料-电子功用-四结级联太阳能电池及其制备方法
JQuery实例-年月日级联菜单.rar
matlab开发-多电平级联H桥变换器的控制。七电平移相移相脉宽调制CHB逆变器的THD研究
电子政务-一种级联式电压测试装置.zip
基于EMD-CF的级联光栅微振动传感器光谱优化算法.docx
android读取xml资源实现省-市-区的级联选择 具体参考我的博客: http://blog.csdn.net/jiguangcanhen/article/details/41074703 改资源为ant架构,gradle架构,请下载之后自己用Eclipse导吧。
电信设备-一种级联式存储介质信息消除装置.zip