[原创] 扩展jquery-treegrid插件, 实现勾选功能和全删按钮.
新上手一个项目, 因而正好想学习下bootstrap, 所以就采用asp.net mvc + bootstrap来做. 因为需要TreeGrid的控件, 本来想用easyUI、LingerUi、DWZ, 但显示效果总觉得不协调. 搜来搜去, 发现了牛人写的 jquery-treegrid, 所以就参考这园子里的两篇文章开始做:
JS组件系列——自己动手封装bootstrap-treegrid组件: http://www.cnblogs.com/landeanfen/p/6776152.html
JS组件系列——封装自己的JS组件,你也可以: http://www.cnblogs.com/landeanfen/p/5124542.html
这次目的是扩展jquery-treegrid插件, 实现checkbox的全选、单选, 也照着上文添加了ajax远程获取数据的功能. 虽然后来发现了Kendo UI, 但本着学习的目的, 还是完成了这次的插件扩展功能.
由于常年没有接触过前端, 所以jquery基本语法都磕磕绊绊更别说扩展插件了, 边摸索边做. 待我改完一版本, 才能理解了jquery-treegrid插件的作者真的牛掰:
1. jquery-treegrid思想: 没有硬编码的html, 全部通过css样式实现. 像树形结点的维护、结点的打开与折叠状态, 都是由写在TR元素上的css来实现. 也倒是jquery本身不熟吧, 我第一次见这么少的html来实现的jQuery控件.
2. 插件的结构: 跟上面的总体结构类似, 都是 method{}方法集合、$.fn.treegrid扩展、default{}默认参数对象. 其通过初始化函数initTree来开始渲染table元素, 通过保存控件容器(TreeContainer) -> 保存全局设置(Settings) -> 递归地初始化结点(initNode) -> 为每个结点添加事件(intExpander、initIdent、initEvents、initState、initChangeEvent、initSettingsEvents)来完成最终功能. 整体上有点面向对象的意味, 跟之前自己写的JS差距甚大.
刚开始我也是照着前面两篇的文章来实现了基本的样子, 当我快做完的时候才理解了jquery-treegrid控件作者的思路. 根据前两篇文章的思路, 就是在初始化方法中, 通过ajax获取数据, 然后在回调方法中拼接HTML表格, 来完成对jquery-treegrid的远程取数据的扩展. 当我基本理解了jQuery-treegrid作者的思想以后, 尝试将上面的代码改成: 在获取远程数据后, render表格(renderHeader、RenderBody、递归的生成List类型的Tr和Tree类型的Tr)、之后初始化Header(初始化checkAll、DelAll、操作列)、再往后初始化结点(initExpander、initIndent、initCheck、initOperation、initEvnets、initState、initChangeEvent、initSettingsEvents). 所有操作(如:全选、全部选、直选部分)等操作, 也都是通过在Tr元素上附加css来实现的.
总结实现过程的砍儿:
1. 理解插件开发思路及手段, 为什么采用如此结构来组织插件.
2. 控件状态的处理其实是使用了cookie, 用jquery-cookie来实现的.
3. 特别要理解This所代表的对象, 可以在调试界面一步步验证this所代表的对象.
4. 关于原jquery-treegrid插件的封装, $(this).原控件('方法名','参数')来封装. 这里需要注意的是: 在我们自己的扩展代码中, 关于状态保存、容器位置、设置保存等内容, 我都是通过对原控件的封装, 将这些数据写在同一个位置, 以便实现我们自己的控件和原控件之间的数据共享.
5. 默认default对象之中的方法的调用: 1. 通过settings.方法名.apply(this, '参数')来调用. 2. 通过我们扩展控件中封装的, $(this).treegridExt('getSetting','方法名').apply(this,'参数')来实现的.
6. 注意参数的问题: 有时用this、有时用$(this)、有时用$($(this).treegridExt('方法名'))、有使用[$(this)], 有时用apply(this)、还有时用apply($(Elem))等等. 决定使用哪种方式的的根本原因就是 this所代表的当前对象. 根据当前对象的不同, 来变换几种参数形式.
最后, 废话不多说, 上代码. 注意: 改代码只实现了全选、全不选、选子项、以及子项变更后对父级选项的调整. 之后没有再深入编码, 因为项目还是比较紧, 考虑一个个控件自己搞还是太费劲了, 准备采用Kendo控件来完成项目, 此Demo仅作为学习jquery和扩展其插件的相关知识为目的. 顺带对老大说声抱歉, 多耽误2,3天(算上端午的话可能是5天).
//jquery.treegrid.js
- /*
- * jQuery treegrid Plugin 0.3.0
- * https://github.com/maxazan/jquery-treegrid
- *
- * Copyright 2013, Pomazan Max
- * Licensed under the MIT licenses.
- */
- (function($) {
- var methods = {
- /**
- * Initialize tree
- *
- * @param {Object} options
- * @returns {Object[]}
- */
- initTree: function(options) {
- var settings = $.extend({}, this.treegrid.defaults, options);
- return this.each(function() {
- var $this = $(this);
- $this.treegrid('setTreeContainer', $(this));
- $this.treegrid('setSettings', settings);
- settings.getRootNodes.apply(this, [$(this)]).treegrid('initNode', settings);
- $this.treegrid('getRootNodes').treegrid('render');
- });
- },
- /**
- * Initialize node
- *
- * @param {Object} settings
- * @returns {Object[]}
- */
- initNode: function(settings) {
- return this.each(function() {
- var $this = $(this);
- $this.treegrid('setTreeContainer', settings.getTreeGridContainer.apply(this));
- $this.treegrid('getChildNodes').treegrid('initNode', settings);
- $this.treegrid('initExpander').treegrid('initIndent').treegrid('initEvents').treegrid('initState').treegrid('initChangeEvent').treegrid("initSettingsEvents");
- });
- },
- initChangeEvent: function() {
- var $this = $(this);
- //Save state on change
- $this.on("change", function() {
- var $this = $(this);
- $this.treegrid('render');
- if ($this.treegrid('getSetting', 'saveState')) {
- $this.treegrid('saveState');
- }
- });
- return $this;
- },
- /**
- * Initialize node events
- *
- * @returns {Node}
- */
- initEvents: function() {
- var $this = $(this);
- //Default behavior on collapse
- $this.on("collapse", function() {
- var $this = $(this);
- $this.removeClass('treegrid-expanded');
- $this.addClass('treegrid-collapsed');
- });
- //Default behavior on expand
- $this.on("expand", function() {
- var $this = $(this);
- $this.removeClass('treegrid-collapsed');
- $this.addClass('treegrid-expanded');
- });
- return $this;
- },
- /**
- * Initialize events from settings
- *
- * @returns {Node}
- */
- initSettingsEvents: function() {
- var $this = $(this);
- //Save state on change
- $this.on("change", function() {
- var $this = $(this);
- if (typeof($this.treegrid('getSetting', 'onChange')) === "function") {
- $this.treegrid('getSetting', 'onChange').apply($this);
- }
- });
- //Default behavior on collapse
- $this.on("collapse", function() {
- var $this = $(this);
- if (typeof($this.treegrid('getSetting', 'onCollapse')) === "function") {
- $this.treegrid('getSetting', 'onCollapse').apply($this);
- }
- });
- //Default behavior on expand
- $this.on("expand", function() {
- var $this = $(this);
- if (typeof($this.treegrid('getSetting', 'onExpand')) === "function") {
- $this.treegrid('getSetting', 'onExpand').apply($this);
- }
- });
- return $this;
- },
- /**
- * Initialize expander for node
- *
- * @returns {Node}
- */
- initExpander: function() {
- var $this = $(this);
- var cell = $this.find('td').get($this.treegrid('getSetting', 'treeColumn'));
- var tpl = $this.treegrid('getSetting', 'expanderTemplate');
- var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
- if (expander) {
- expander.remove();
- }
- $(tpl).prependTo(cell).click(function() {
- $($(this).closest('tr')).treegrid('toggle');
- });
- return $this;
- },
- /**
- * Initialize indent for node
- *
- * @returns {Node}
- */
- initIndent: function() {
- var $this = $(this);
- $this.find('.treegrid-indent').remove();
- var tpl = $this.treegrid('getSetting', 'indentTemplate');
- var expander = $this.find('.treegrid-expander');
- var depth = $this.treegrid('getDepth');
- for (var i = 0; i < depth; i++) {
- $(tpl).insertBefore(expander);
- }
- return $this;
- },
- /**
- * Initialise state of node
- *
- * @returns {Node}
- */
- initState: function() {
- var $this = $(this);
- if ($this.treegrid('getSetting', 'saveState') && !$this.treegrid('isFirstInit')) {
- $this.treegrid('restoreState');
- } else {
- if ($this.treegrid('getSetting', 'initialState') === "expanded") {
- $this.treegrid('expand');
- } else {
- $this.treegrid('collapse');
- }
- }
- return $this;
- },
- /**
- * Return true if this tree was never been initialised
- *
- * @returns {Boolean}
- */
- isFirstInit: function() {
- var tree = $(this).treegrid('getTreeContainer');
- if (tree.data('first_init') === undefined) {
- tree.data('first_init', $.cookie(tree.treegrid('getSetting', 'saveStateName')) === undefined);
- }
- return tree.data('first_init');
- },
- /**
- * Save state of current node
- *
- * @returns {Node}
- */
- saveState: function() {
- var $this = $(this);
- if ($this.treegrid('getSetting', 'saveStateMethod') === 'cookie') {
- var stateArrayString = $.cookie($this.treegrid('getSetting', 'saveStateName')) || '';
- var stateArray = (stateArrayString === '' ? [] : stateArrayString.split(','));
- var nodeId = $this.treegrid('getNodeId');
- if ($this.treegrid('isExpanded')) {
- if ($.inArray(nodeId, stateArray) === -1) {
- stateArray.push(nodeId);
- }
- } else if ($this.treegrid('isCollapsed')) {
- if ($.inArray(nodeId, stateArray) !== -1) {
- stateArray.splice($.inArray(nodeId, stateArray), 1);
- }
- }
- $.cookie($this.treegrid('getSetting', 'saveStateName'), stateArray.join(','));
- }
- return $this;
- },
- /**
- * Restore state of current node.
- *
- * @returns {Node}
- */
- restoreState: function() {
- var $this = $(this);
- if ($this.treegrid('getSetting', 'saveStateMethod') === 'cookie') {
- var stateArray = $.cookie($this.treegrid('getSetting', 'saveStateName')).split(',');
- if ($.inArray($this.treegrid('getNodeId'), stateArray) !== -1) {
- $this.treegrid('expand');
- } else {
- $this.treegrid('collapse');
- }
- }
- return $this;
- },
- /**
- * Method return setting by name
- *
- * @param {type} name
- * @returns {unresolved}
- */
- getSetting: function(name) {
- if (!$(this).treegrid('getTreeContainer')) {
- return null;
- }
- return $(this).treegrid('getTreeContainer').data('settings')[name];
- },
- /**
- * Add new settings
- *
- * @param {Object} settings
- */
- setSettings: function(settings) {
- $(this).treegrid('getTreeContainer').data('settings', settings);
- },
- /**
- * Return tree container
- *
- * @returns {HtmlElement}
- */
- getTreeContainer: function() {
- return $(this).data('treegrid');
- },
- /**
- * Set tree container
- *
- * @param {HtmlE;ement} container
- */
- setTreeContainer: function(container) {
- return $(this).data('treegrid', container);
- },
- /**
- * Method return all root nodes of tree.
- *
- * Start init all child nodes from it.
- *
- * @returns {Array}
- */
- getRootNodes: function () {
- return $(this).treegrid('getSetting', 'getRootNodes').apply(this, [$(this).treegrid('getTreeContainer')]);
- },
- /**
- * Method return all nodes of tree.
- *
- * @returns {Array}
- */
- getAllNodes: function() {
- return $(this).treegrid('getSetting', 'getAllNodes').apply(this, [$(this).treegrid('getTreeContainer')]);
- },
- /**
- * Mthod return true if element is Node
- *
- * @returns {String}
- */
- isNode: function() {
- return $(this).treegrid('getNodeId') !== null;
- },
- /**
- * Mthod return id of node
- *
- * @returns {String}
- */
- getNodeId: function() {
- if ($(this).treegrid('getSetting', 'getNodeId') === null) {
- return null;
- } else {
- return $(this).treegrid('getSetting', 'getNodeId').apply(this);
- }
- },
- /**
- * Method return parent id of node or null if root node
- *
- * @returns {String}
- */
- getParentNodeId: function() {
- return $(this).treegrid('getSetting', 'getParentNodeId').apply(this);
- },
- /**
- * Method return parent node or null if root node
- *
- * @returns {Object[]}
- */
- getParentNode: function() {
- if ($(this).treegrid('getParentNodeId') === null) {
- return null;
- } else {
- return $(this).treegrid('getSetting', 'getNodeById').apply(this, [$(this).treegrid('getParentNodeId'), $(this).treegrid('getTreeContainer')]);
- }
- },
- /**
- * Method return array of child nodes or null if node is leaf
- *
- * @returns {Object[]}
- */
- getChildNodes: function() {
- return $(this).treegrid('getSetting', 'getChildNodes').apply(this, [$(this).treegrid('getNodeId'), $(this).treegrid('getTreeContainer')]);
- },
- /**
- * Method return depth of tree.
- *
- * This method is needs for calculate indent
- *
- * @returns {Number}
- */
- getDepth: function() {
- if ($(this).treegrid('getParentNode') === null) {
- return 0;
- }
- return $(this).treegrid('getParentNode').treegrid('getDepth') + 1;
- },
- /**
- * Method return true if node is root
- *
- * @returns {Boolean}
- */
- isRoot: function() {
- return $(this).treegrid('getDepth') === 0;
- },
- /**
- * Method return true if node has no child nodes
- *
- * @returns {Boolean}
- */
- isLeaf: function() {
- return $(this).treegrid('getChildNodes').length === 0;
- },
- /**
- * Method return true if node last in branch
- *
- * @returns {Boolean}
- */
- isLast: function() {
- if ($(this).treegrid('isNode')) {
- var parentNode = $(this).treegrid('getParentNode');
- if (parentNode === null) {
- if ($(this).treegrid('getNodeId') === $(this).treegrid('getRootNodes').last().treegrid('getNodeId')) {
- return true;
- }
- } else {
- if ($(this).treegrid('getNodeId') === parentNode.treegrid('getChildNodes').last().treegrid('getNodeId')) {
- return true;
- }
- }
- }
- return false;
- },
- /**
- * Method return true if node first in branch
- *
- * @returns {Boolean}
- */
- isFirst: function() {
- if ($(this).treegrid('isNode')) {
- var parentNode = $(this).treegrid('getParentNode');
- if (parentNode === null) {
- if ($(this).treegrid('getNodeId') === $(this).treegrid('getRootNodes').first().treegrid('getNodeId')) {
- return true;
- }
- } else {
- if ($(this).treegrid('getNodeId') === parentNode.treegrid('getChildNodes').first().treegrid('getNodeId')) {
- return true;
- }
- }
- }
- return false;
- },
- /**
- * Return true if node expanded
- *
- * @returns {Boolean}
- */
- isExpanded: function() {
- return $(this).hasClass('treegrid-expanded');
- },
- /**
- * Return true if node collapsed
- *
- * @returns {Boolean}
- */
- isCollapsed: function() {
- return $(this).hasClass('treegrid-collapsed');
- },
- /**
- * Return true if at least one of parent node is collapsed
- *
- * @returns {Boolean}
- */
- isOneOfParentsCollapsed: function() {
- var $this = $(this);
- if ($this.treegrid('isRoot')) {
- return false;
- } else {
- if ($this.treegrid('getParentNode').treegrid('isCollapsed')) {
- return true;
- } else {
- return $this.treegrid('getParentNode').treegrid('isOneOfParentsCollapsed');
- }
- }
- },
- /**
- * Expand node
- *
- * @returns {Node}
- */
- expand: function() {
- if (!this.treegrid('isLeaf') && !this.treegrid("isExpanded")) {
- this.trigger("expand");
- this.trigger("change");
- return this;
- }
- return this;
- },
- /**
- * Expand all nodes
- *
- * @returns {Node}
- */
- expandAll: function() {
- var $this = $(this);
- $this.treegrid('getRootNodes').treegrid('expandRecursive');
- return $this;
- },
- /**
- * Expand current node and all child nodes begin from current
- *
- * @returns {Node}
- */
- expandRecursive: function() {
- return $(this).each(function() {
- var $this = $(this);
- $this.treegrid('expand');
- if (!$this.treegrid('isLeaf')) {
- $this.treegrid('getChildNodes').treegrid('expandRecursive');
- }
- });
- },
- /**
- * Collapse node
- *
- * @returns {Node}
- */
- collapse: function() {
- return $(this).each(function() {
- var $this = $(this);
- if (!$this.treegrid('isLeaf') && !$this.treegrid("isCollapsed")) {
- $this.trigger("collapse");
- $this.trigger("change");
- }
- });
- },
- /**
- * Collapse all nodes
- *
- * @returns {Node}
- */
- collapseAll: function() {
- var $this = $(this);
- $this.treegrid('getRootNodes').treegrid('collapseRecursive');
- return $this;
- },
- /**
- * Collapse current node and all child nodes begin from current
- *
- * @returns {Node}
- */
- collapseRecursive: function() {
- return $(this).each(function() {
- var $this = $(this);
- $this.treegrid('collapse');
- if (!$this.treegrid('isLeaf')) {
- $this.treegrid('getChildNodes').treegrid('collapseRecursive');
- }
- });
- },
- /**
- * Expand if collapsed, Collapse if expanded
- *
- * @returns {Node}
- */
- toggle: function() {
- var $this = $(this);
- if ($this.treegrid('isExpanded')) {
- $this.treegrid('collapse');
- } else {
- $this.treegrid('expand');
- }
- return $this;
- },
- /**
- * Rendering node
- *
- * @returns {Node}
- */
- render: function() {
- return $(this).each(function() {
- var $this = $(this);
- //if parent colapsed we hidden
- if ($this.treegrid('isOneOfParentsCollapsed')) {
- $this.hide();
- } else {
- $this.show();
- }
- if (!$this.treegrid('isLeaf')) {
- $this.treegrid('renderExpander');
- $this.treegrid('getChildNodes').treegrid('render');
- }
- });
- },
- /**
- * Rendering expander depends on node state
- *
- * @returns {Node}
- */
- renderExpander: function() {
- return $(this).each(function() {
- var $this = $(this);
- var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
- if (expander) {
- if (!$this.treegrid('isCollapsed')) {
- expander.removeClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
- expander.addClass($this.treegrid('getSetting', 'expanderExpandedClass'));
- } else {
- expander.removeClass($this.treegrid('getSetting', 'expanderExpandedClass'));
- expander.addClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
- }
- } else {
- $this.treegrid('initExpander');
- $this.treegrid('renderExpander');
- }
- });
- }
- };
- $.fn.treegrid = function(method) {
- if (methods[method]) {
- return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
- } else if (typeof method === 'object' || !method) {
- return methods.initTree.apply(this, arguments);
- } else {
- $.error('Method with name ' + method + ' does not exists for jQuery.treegrid');
- }
- };
- /**
- * Plugin's default options
- */
- $.fn.treegrid.defaults = {
- initialState: 'expanded',
- saveState: false,
- saveStateMethod: 'cookie',
- saveStateName: 'tree-grid-state',
- expanderTemplate: '<span class="treegrid-expander"></span>',
- indentTemplate: '<span class="treegrid-indent"></span>',
- expanderExpandedClass: 'treegrid-expander-expanded',
- expanderCollapsedClass: 'treegrid-expander-collapsed',
- treeColumn: 0,
- getExpander: function() {
- return $(this).find('.treegrid-expander');
- },
- getNodeId: function() {
- var template = /treegrid-([A-Za-z0-9_-]+)/;
- if (template.test($(this).attr('class'))) {
- return template.exec($(this).attr('class'))[1];
- }
- return null;
- },
- getParentNodeId: function() {
- var template = /treegrid-parent-([A-Za-z0-9_-]+)/;
- if (template.test($(this).attr('class'))) {
- return template.exec($(this).attr('class'))[1];
- }
- return null;
- },
- getNodeById: function(id, treegridContainer) {
- var templateClass = "treegrid-" + id;
- return treegridContainer.find('tr.' + templateClass);
- },
- getChildNodes: function(id, treegridContainer) {
- var templateClass = "treegrid-parent-" + id;
- return treegridContainer.find('tr.' + templateClass);
- },
- getTreeGridContainer: function() {
- return $(this).closest('table');
- },
- getRootNodes: function(treegridContainer) {
- var result = $.grep(treegridContainer.find('tr'), function(element) {
- var classNames = $(element).attr('class');
- var templateClass = /treegrid-([A-Za-z0-9_-]+)/;
- var templateParentClass = /treegrid-parent-([A-Za-z0-9_-]+)/;
- return templateClass.test(classNames) && !templateParentClass.test(classNames);
- });
- return $(result);
- },
- getAllNodes: function(treegridContainer) {
- var result = $.grep(treegridContainer.find('tr'), function(element) {
- var classNames = $(element).attr('class');
- var templateClass = /treegrid-([A-Za-z0-9_-]+)/;
- return templateClass.test(classNames);
- });
- return $(result);
- },
- //Events
- onCollapse: null,
- onExpand: null,
- onChange: null
- };
- })(jQuery);
//jquery.treegrid.css
- .treegrid-indent {width:16px; height: 16px; display: inline-block; position: relative;}
- .treegrid-expander {width:16px; height: 16px; display: inline-block; position: relative; cursor: pointer;}
- .treegrid-expander-expanded{background-image: url(../img/collapse.png); }
- .treegrid-expander-collapsed{background-image: url(../img/expand.png);}
//jquery.treegrid.bootstrap3.js
- $.extend($.fn.treegrid.defaults, {
- expanderExpandedClass: 'glyphicon glyphicon-chevron-down',
- expanderCollapsedClass: 'glyphicon glyphicon-chevron-right'
- });
//jquey.cookie.js
- /*!
- * jQuery Cookie Plugin v1.3.1
- * https://github.com/carhartl/jquery-cookie
- *
- * Copyright 2013 Klaus Hartl
- * Released under the MIT license
- */
- (function (factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD. Register as anonymous module.
- define(['jquery'], factory);
- } else {
- // Browser globals.
- factory(jQuery);
- }
- }(function ($) {
- var pluses = /\+/g;
- function decode(s) {
- if (config.raw) {
- return s;
- }
- return decodeURIComponent(s.replace(pluses, ' '));
- }
- function decodeAndParse(s) {
- if (s.indexOf('"') === 0) {
- // This is a quoted cookie as according to RFC2068, unescape...
- s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
- }
- s = decode(s);
- try {
- return config.json ? JSON.parse(s) : s;
- } catch(e) {}
- }
- var config = $.cookie = function (key, value, options) {
- // Write
- if (value !== undefined) {
- options = $.extend({}, config.defaults, options);
- if (typeof options.expires === 'number') {
- var days = options.expires, t = options.expires = new Date();
- t.setDate(t.getDate() + days);
- }
- value = config.json ? JSON.stringify(value) : String(value);
- return (document.cookie = [
- config.raw ? key : encodeURIComponent(key),
- '=',
- config.raw ? value : encodeURIComponent(value),
- options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
- options.path ? '; path=' + options.path : '',
- options.domain ? '; domain=' + options.domain : '',
- options.secure ? '; secure' : ''
- ].join(''));
- }
- // Read
- var cookies = document.cookie.split('; ');
- var result = key ? undefined : {};
- for (var i = 0, l = cookies.length; i < l; i++) {
- var parts = cookies[i].split('=');
- var name = decode(parts.shift());
- var cookie = parts.join('=');
- if (key && key === name) {
- result = decodeAndParse(cookie);
- break;
- }
- if (!key) {
- result[name] = decodeAndParse(cookie);
- }
- }
- return result;
- };
- config.defaults = {};
- $.removeCookie = function (key, options) {
- if ($.cookie(key) !== undefined) {
- // Must not alter options, thus extending a fresh object...
- $.cookie(key, '', $.extend({}, options, { expires: -1 }));
- return true;
- }
- return false;
- };
- }));
////以上是jquery-treegrid的主要先关内容, 以下是这次扩展的代码
//jquey.treegrid.extention.js
- /*
- * jQuery treegrid extension 0.1.0
- *
- * Copyright 2017, Jalen Zhang
- * Licensed under the MIT licenses.
- */
- ; (function ($) {
- "use strict"; //严格模式下, 全局对象无法使用默认绑定
- /*begin private functions*/
- var nodeCount = 0; //全局结点计数
- //从数据中获取跟结点
- var getRootNodesFromData = function (data,isTreedData,parentCol,sortCol) {
- var result = [];
- $.each(data, function (index, item) {
- if (isTreedData || !item[parentCol] || item[parentCol] == 0) {
- result.push(item);
- }
- });
- if (sortCol) {
- result.sort(function (a, b) {
- return a[sortCol] - b[sortCol];
- });
- }
- return result;
- }
- //从数据中获取子节点
- var getListChildNodesFromData = function (data, parentNode,idCol,parentCol,sortCol) {
- var unsort = [];
- $.each(data, function (i, item) {
- if (item[parentCol] == parentNode[idCol]) {
- unsort.push(item);
- }
- });
- if (unsort == null || unsort.length < 1)
- return;
- if (sortCol) {
- unsort.sort(function (a, b) {
- return a[sortCol] - b[sortCol];
- });
- }
- return unsort;
- }
- var getTreeChildNodesFromdata = function (parentNode,childCol,sortCol) {
- if (childCol) {
- var childNodes = parentNode[childCol];
- if (sortCol)
- childNodes.sort(function (a, b) {
- return a[sortCol] - b[sortCol];
- });
- return childNodes;
- }
- return null;
- }
- /*end private functions*/
- /*Main*/
- $.fn.treegridExt = function (method) {
- if (methods[method]) {
- //如果是调用方法(参数对象中含有方法名)
- return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
- } else if (typeof method === 'object' || !method) {
- //调用初始化函数(参数不含方法名)
- return methods.initExtTree.apply(this, arguments);
- } else {
- $.error('Method with name ' + method + ' does not exists for jQuery.treegridExt');
- return this;
- }
- };
- /*public functions*/
- var methods = {
- initExtTree: function (options) {
- //获取配置信息
- var settings = $.extend({}, this.treegrid.defaults, this.treegridExt.defaults, options || {});
- var $this = $(this);
- //Code
- //设置控件容器
- $this.treegridExt('setTreeContainer', $this);
- //保存设置
- $this.treegridExt('setSettings', settings);
- if (!settings.url) {
- //载入数据
- var data = $this.treegridExt('loadData',settings);
- if (data && data.length > 0) {
- //生成表格
- $this.treegridExt('renderTable',data);
- }
- //初始化header
- settings.getTableHeader.apply(this,[$this]).treegridExt('initHeader',settings);
- //初始化结点
- settings.getRootNodes.apply(this, [$this]).treegridExt('initNode', settings);
- //生成树
- $this.treegridExt('getRootNodes').treegridExt('render');
- //默认展开状态
- if (!settings.expandAll) {
- $this.treegridExt('collapseAll');
- }
- } else {
- $this.treegridExt('loadData',settings);
- }
- return $this;
- },
- dispose: function (options) {
- return $(this).each(function () {
- var $this = $(this);
- $this.treegridExt('delState');
- $this.treegridExt('delSettings');
- $this.treegridExt('delTreeContainer');
- });
- },
- val: function (options) {
- //获取选择器中第一个元素的html
- return this.eq(0).html();
- },
- //##Beigin自定义初始化方法
- /*init*/
- initHeader: function (settings) {
- return this.each(function () {
- var $this = $(this);
- $this.treegridExt('setTreeContainer', settings.getTreeGridContainer.apply(this));
- $this.treegridExt('initCheckAll').treegridExt('initDelAll');
- if ($this.treegridExt('getSetting', 'showOperation')) {
- var cell = $('<th></th>');
- cell.text('操作');
- $this.append(cell);
- }
- return $this;
- });
- },
- initNode: function (settings) {
- return this.each(function () {
- var $this = $(this);
- $this.treegridExt('setTreeContainer', settings.getTreeGridContainer.apply(this));
- $this.treegridExt('initExpander').treegridExt('initIndent').treegridExt('initCheck').treegridExt('initOperation').treegridExt('initEvents').treegridExt('initState').treegridExt('initChangeEvent').treegridExt('initSettingsEvents');
- $this.treegridExt('getChildNodes').treegridExt('initNode', settings);
- });
- },
- initCheckAll: function () {
- var $this = $(this);
- if ($this.treegridExt('getSetting', 'showCheck') && $this.treegridExt('getSetting', 'showCheckAll')) {
- $this.addClass('treegridExt-checkboxAll');
- var cell = $('<th></th>');
- var tpl = $this.treegridExt('getSetting', 'checkTemplate');
- var checks = $this.treegridExt('getSetting', 'getCheckbox').apply(this);
- if (checks && checks.length > 0) {
- checks.remove();
- }
- $this.prepend(cell.append(tpl));
- $this.treegridExt('getSetting', 'getCheckbox').apply(this).click(function () { $this.treegridExt('toggleCheckAll'); });
- }
- return $this;
- },
- initDelAll: function () {
- var $this = $(this);
- if ($this.treegridExt('getSetting', 'showCheckAll') && $this.treegridExt('getSetting', 'showDelAll')) {
- var cell = $this.find('th').get(0);
- var delTpl = $this.treegridExt('getSetting', 'delAllTemplate');
- var checks = $this.treegridExt('getSetting', 'getDelAll').apply(this);
- if (checks && checks.length > 0) {
- checks.remove();
- }
- $(cell).append(delTpl);
- $this.treegridExt('getSetting', 'getDelAll').apply(this).click(function () { $this.treegridExt('delChecked'); });
- }
- return $this;
- },
- initCheck: function () {
- var $this = $(this);
- if ($this.treegridExt('getSetting', 'showCheck')) {
- var cell = $('<td></td>');
- var tpl = $this.treegridExt('getSetting', 'checkTemplate');
- var checks = $this.treegridExt('getSetting', 'getCheckbox');
- if (checks && checks.length > 0) {
- checks.remove();
- }
- $this.prepend(cell.append(tpl));
- $this.treegridExt('getSetting', 'getCheckbox').apply(this).click(function () { $this.treegridExt('toggleCheck'); });
- }
- return $this;
- },
- initOperation: function () {
- var $this = $(this);
- if ($this.treegridExt('getSetting', 'showOperation')) {
- var cell = $('<td></td>');
- var tpl = $this.treegridExt('getSetting', 'operationTemplate');
- $this.append(cell.append(tpl));
- }
- return $this;
- },
- initEvents: function () {
- var $this = $(this);
- //Default behavior on check
- $this.on('check', function () {
- var $this = $(this);
- $this.addClass('treegrid-checked');
- });
- //Default behavior on other operations
- return $this.treegrid('initEvents');
- },
- initSettingsEvents: function () {
- var $this = $(this);
- //Save state on check
- $this.on('check', function () {
- var $this = $(this);
- if (typeof ($this.treegridExt('getSetting', 'onCheck')) === "function") {
- $this.treegridExt('getSetting', 'onCheck').apply($this);
- }
- });
- //Save state on other operation
- return $this.treegrid('initSettingsEvents');
- },
- //##end自定义的初始化方法
- //##Begin原组件的方法的封装
- /*init*/
- initExpander: function () {
- return $(this).treegrid('initExpander');
- },
- initIndent: function () {
- return $(this).treegrid('initIndent');
- },
- initState: function () {
- return $(this).treegrid('initState');
- },
- initChangeEvent: function () {
- var $this = $(this);
- //Save state on chagne
- $this.on('change', function () {
- var $this = $(this);
- $this.treegridExt('render');
- if ($this.treegridExt('getSetting', 'saveState')) {
- $this.treegridExt('saveState');
- }
- });
- return $this;
- },
- /*init-event*/
- /*base*/
- getTreeContainer: function () {
- return $(this).treegrid('getTreeContainer');
- },
- setTreeContainer: function (container) {
- //扩展插件和原插件使用相同的存储空间
- return $(this).treegrid('setTreeContainer', container);
- },
- getSetting: function (name) {
- return $(this).treegrid('getSetting',name);
- },
- setSettings: function (settings) {
- return $(this).treegrid('setSettings',settings);
- },
- restoreState: function () {
- return $(this).treegrid('restoreState');
- },
- saveState: function () {
- return $(this).treegrid('saveState');
- },
- /*node*/
- getAllNodes: function () {
- return $(this).treegrid('getAllNodes');
- },
- getParentNode: function () {
- return $(this).treegrid('getParentNode');
- },
- getChildNodes: function () {
- return $(this).treegrid('getChildNodes');
- },
- /*fake-id*/
- getNodeId: function () {
- return $(this).treegrid('getNodeId');
- },
- getParentNodeId: function () {
- return $(this).treegrid('getParentNodeId');
- },
- getDepth: function () {
- return $(this).treegrid('getDepth');
- },
- /*bool*/
- isRoot: function () {
- return $(this).treegrid('isRoot');
- },
- isNode: function () {
- return $(this).treegrid('isNode');
- },
- isLeaf: function () {
- return $(this).treegrid('isLeaf');
- },
- isFirst: function () {
- return $(this).treegrid('isFirst');
- },
- isLast: function () {
- return $(this).treegrid('isLast');
- },
- isExpanded: function () {
- return $(this).treegrid('isExpanded');
- },
- isCollapsed: function () {
- return $(this).treegrid('isCollapsed');
- },
- isFirstInit: function () {
- return $(this).treegrid('isFirstInit');
- },
- isOneOfParentsCollapsed: function () {
- return $(this).treegrid('isOneOfParentsCollapsed');
- },
- /*verb*/
- expand: function () {
- return $(this).treegrid('expand');
- },
- expandAll: function () {
- return $(this).treegrid('expandAll');
- },
- expandRecursive: function () {
- return $(this).treegrid('expandRecursive');
- },
- collapse: function () {
- return $(this).treegrid('collapse');
- },
- collapseAll: function () {
- return $(this).treegrid('collapseAll');
- },
- collapseRecursive: function () {
- return $(this).treegrid('collapseRecursive');
- },
- /*
- toggle: function () {
- return $(this).treegrid('toggle').apply(this);
- },*/
- //##End原组件方法的封装
- //自定义的方法........
- delState: function () {
- $.cookie($this.treegridExt('getSetting', 'saveStateName'), null);
- },
- delSettings: function () {
- if (!$(this).treegridExt('getTreeContainer'))
- return;
- $this.treegridExt('getTreeContainer').removeData('settings');
- },
- delTreeContainer: function () {
- if (!$(this).treegridExt('getTreeContainer'))
- return;
- return $(this).removeData('treegrid', container);
- },
- check: function (isCheck) {
- var $this = $(this);
- if (isCheck) {
- $this.treegridExt('getSetting', 'getCheckbox').apply(this).prop('checked',true);
- $this.addClass('treegridExt-checked');
- if ($this.treegrid('isCollapsed')) {
- $this.treegrid('expand');
- }
- } else {
- $this.treegridExt('getSetting', 'getCheckbox').apply(this).prop('checked', false);
- $this.removeClass('treegridExt-checked');
- }
- return $this;
- },
- checkDownRecursive: function (isCheck) {
- //return $(this).each(function () {
- var $this = $(this);
- $this.treegridExt('check', isCheck);
- if (!$this.treegridExt('isLeaf')) {
- $this.treegridExt('getChildNodes').treegridExt('checkDownRecursive', isCheck);
- }
- return $this;
- //});
- },
- checkUpRecursive: function (isCheck) {
- var parentNode = $(this).treegridExt('getParentNode');
- if (parentNode) {
- var tag = true;
- $.each(parentNode.treegridExt('getChildNodes'), function () {
- var $this = $(this);
- //异或: T^T(false)、T^F(true)、F^T(true)、F^F(false), 全选或全不选(true), 否则为false.
- if (isCheck ^ $this.treegridExt('isChecked')) {
- tag = false;
- return false;
- }
- });
- //与非: !(T^T)(false)、!(T^F)(true)、!(F^T)(true)、F^F(true)
- if (!(isCheck || tag)) {
- //选的不全
- parentNode.treegridExt('check', true);
- parentNode.addClass('treegridExt-partialChecked');
- } else if (isCheck) {
- //全选
- parentNode.treegridExt('check', true);
- parentNode.removeClass('treegridExt-partialChecked');
- } else {
- //全不选
- parentNode.treegridExt('check', false);
- parentNode.removeClass('treegridExt-partialChecked');
- }
- if (!parentNode.treegridExt('getParentNode')) {
- parentNode.treegridExt('checkUpRecursive', isCheck);
- }
- } else {
- //rootNodes
- var $this = $(this);
- var checkCount = 0;
- var rootNodes = $this.treegridExt('getRootNodes');
- $.each(rootNodes, function (index, item) {
- var $item = $(item);
- if($item.treegridExt('isChecked')){
- checkCount++;
- }
- if ($item.treegridExt('isPartialChecked')) {
- checkCount--;
- }
- });
- var chkTr = $this.treegridExt('getSetting','getTableHeader').apply(this,[$($this.treegridExt('getTreeContainer'))]);
- if (checkCount < rootNodes.length) {
- //全不选,部分选
- if (isCheck || checkCount > 0) {
- //chkTr.find('input[type="checkbox"]').prop('checked',true);
- chkTr.treegridExt('getSetting', 'getCheckbox').apply($(chkTr)).prop('checked', true);
- chkTr.removeClass('treegridExt-checkedAll').addClass('treegridExt-partialChecked');
- } else {
- chkTr.treegridExt('getSetting', 'getCheckbox').apply($(chkTr)).prop('checked', false);
- chkTr.removeClass('treegridExt-checkedAll').removeClass('treegridExt-partialChecked');
- }
- } else {
- //全选
- chkTr.treegridExt('getSetting', 'getCheckbox').apply($(chkTr)).prop('checked', true);
- chkTr.removeClass('treegridExt-partialChecked').addClass('treegridExt-checkedAll');
- }
- }
- },
- toggleCheck: function () {
- var $this = $(this);
- var isCheck = $this.treegridExt('isChecked');
- $this.treegridExt('check', !isCheck);
- $this.treegridExt('checkDownRecursive', !isCheck);
- $this.treegridExt('checkUpRecursive', !isCheck);
- return $this;
- },
- toggleCheckAll: function () {
- var $this = $(this);
- var chkAll = $this.treegridExt('getSetting', 'getCheckbox').apply(this);
- var isCheck = $this.treegridExt('isCheckedAll');
- if (isCheck) {
- chkAll.prop('checked', false);
- $this.removeClass('treegridExt-checkedAll');
- } else {
- chkAll.prop('checked', true);
- $this.addClass('treegridExt-checkedAll');
- }
- $.each($this.treegridExt('getRootNodes'), function (index, item) {
- $(item).treegridExt('checkDownRecursive', !isCheck);
- });
- return $this;
- },
- delChecked: function () {
- alert('这是删除按钮啦!');
- },
- getRootNodes: function () {
- return $(this).treegrid('getRootNodes');
- },
- /*bool*/
- isChecked: function () {
- return $(this).hasClass('treegridExt-checked');
- },
- isPartialChecked: function(){
- return $(this).hasClass('treegridExt-partialChecked');
- },
- isCheckedAll: function () {
- return $(this).hasClass('treegridExt-checkedAll');
- },
- isDelAll: function () {
- return $(this).hasClass('treegridExt-delAll');
- },
- /*loadData*/
- loadData: function (settings) {
- var $this = $(this);
- var defData = settings.data;
- var url = settings.url;
- if (defData && defData.length >0) {
- return defData;
- } else if (url) {
- $.ajax({
- type: settings.type,
- url: url,
- data: settings.data,
- dataType: "JSON",
- success: function (data, textStatus, jqXHR) {
- //debugger;
- if (data && data.length > 0) {
- //生成表格
- $this.treegridExt('renderTable',data);
- }
- //初始化Header
- settings.getTableHeader.apply(this, [$this]).treegridExt('initHeader', settings);
- //初始化结点
- settings.getRootNodes.apply(this, [$this]).treegridExt('initNode', settings);
- //生成树
- $this.treegridExt('getRootNodes').treegridExt('render');
- //默认展开状态
- if (!settings.expandAll) {
- $this.treegridExt('collapseAll');
- }
- }
- });
- return $this;
- }
- },
- /*render*/
- render: function () {
- return $(this).each(function () {
- var $this = $(this);
- //if parent colapsed we hidden
- if ($this.treegrid('isOneOfParentsCollapsed')) {
- $this.hide();
- } else {
- $this.show();
- }
- if (!$this.treegrid('isLeaf')) {
- $this.treegrid('renderExpander');
- $this.treegrid('getChildNodes').treegrid('render');
- }
- });
- },
- renderExpander: function () {
- return $(this).each(function () {
- var $this = $(this);
- var expander = $this.treegrid('getSetting', 'getExpander').apply(this);
- if (expander) {
- if (!$this.treegrid('isCollapsed')) {
- expander.removeClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
- expander.addClass($this.treegrid('getSetting', 'expanderExpandedClass'));
- } else {
- expander.removeClass($this.treegrid('getSetting', 'expanderExpandedClass'));
- expander.addClass($this.treegrid('getSetting', 'expanderCollapsedClass'));
- }
- } else {
- $this.treegrid('initExpander');
- $this.treegrid('renderExpander');
- }
- });
- },
- renderTable: function (data) {
- var $this = $(this);
- //debugger;
- //设置表样式
- $this.addClass('table');
- if ($this.treegridExt('getSetting', 'striped')) {
- $this.addClass('table-striped');
- }
- if ($this.treegridExt('getSetting', 'bordered')) {
- $this.addClass('table-bordered');
- }
- //生成表头
- $this.treegridExt('renderHead');
- //生成表体
- $this.treegridExt('renderBody', data);
- return $this;
- },
- renderHead: function () {
- var $this = $(this);
- //debugger;
- var thead = $('<thead></thead>')
- var thr = $('<tr></tr>');
- thr.addClass('treegridExt-header');
- $.each($this.treegridExt('getSetting', 'columns'), function (i, item) {
- var th = $('<th></th>');
- th.text(item.title);
- thr.append(th);
- });
- thr.appendTo(thead);
- return $this.append(thead);
- },
- renderBody: function (data) {
- var $this = $(this);
- var tbody = $('<tbody></tbody>');
- var isTreedData = $this.treegridExt('getSetting', 'treedData');
- var parentCol = $this.treegridExt('getSetting', 'parentColumn');
- var sortCol = $this.treegridExt('getSetting', 'sortColumn');
- var cols = $this.treegridExt('getSetting', 'columns');
- var rootNodes = getRootNodesFromData(data, isTreedData, parentCol, sortCol);
- if (rootNodes && rootNodes.length > 0) {
- $.each(rootNodes, function (i, item) {
- var tr = $('<tr></tr>');
- tr.addClass('treegrid-' + (++nodeCount));
- $.each(cols, function (index, column) {
- var td = $('<td></td>');
- td.text(item[column.field]);
- tr.append(td);
- });
- tbody.append(tr);
- if ($this.treegridExt('getSetting', 'treedData')) {
- var childCol = $this.treegridExt('getSetting', 'childrenColumn');
- $this.treegridExt('renderTreedDataTr', item, nodeCount, cols, childCol, sortCol, tbody);
- } else {
- var idCol = $this.treegridExt('getSetting', 'idColumn');
- $this.treegridExt('renderListDataTr', data, item, nodeCount, cols, idCol, parentCol, sortCol, tbody);
- }
- });
- }
- return $this.append(tbody);
- },
- renderListDataTr: function (data, parentData, parentIndex, columns, idColumn, parentColumn, sortColumn, tbody) {
- var nodes = getListChildNodesFromData(data, parentData, idColumn, parentColumn, sortColumn);
- if (nodes && nodes.length > 0) {
- $.each(nodes, function (i, item) {
- var tr = $('<tr></tr>');
- var nowParentIndex = ++nodeCount;
- tr.addClass('treegrid-' + nowParentIndex);
- tr.addClass('treegrid-parent-' + parentIndex);
- $.each(columns, function (index, column) {
- var td = $('<td></td>');
- td.text(item[column.field]);
- tr.append(td);
- });
- tbody.append(tr);
- $(this).treegridExt('renderListDataTr', data, item, nowParentIndex, columns, idColumn, parentColumn, sortColumn, tbody);
- });
- }
- },
- renderTreedDataTr: function (parentNode, parentIndex, columns, childColumn, sortColumn, tbody) {
- var nodes = getTreeChildNodesFromdata(parentNode, childColumn, sortColumn);
- if (nodes && nodes.length > 0) {
- $each(nodes, function (i, item) {
- var tr = $('<tr></tr>');
- var nowParentIndex = ++nodeCount;
- tr.addClass('treegrid-' + nowParentIndex);
- tr.addClass('treegrid-parent-' + parentIndex);
- $each(columns, function (index, column) {
- var td = $('<td></td>');
- td.text(item[column.field]);
- tr.append(td);
- });
- tbody.append(tr);
- $(this).treegridExt('renderTreedDataTr', item, nowParentIndex, columns, childColumn, sortColumn, tbody);
- });
- }
- },
- };
- /*default values*/
- $.fn.treegridExt.defaults = {
- idColumn: 'Id',
- parentColumn: 'ParentId',
- treeColumn: 0, //在哪一列上显示展开按钮
- treedData: false, //是否树化的数据
- childrenColumn: null, //含有孩子结点的属性, 非树化结构直接值为null
- data: [], //构造table的数据集合
- type: "GET", //请求数据的ajax类型
- url: null, //请求数据的ajax的url
- ajaxParams: {}, //请求数据的ajax的data属性
- sortColumn: null, //按照哪一列进行排序
- striped: false, //是否各行渐变色
- bordered: false, //是否显示边框
- expandAll: true, //是否全部展开
- showCheck: true, //是否显示选择列
- showCheckAll: true, //是否选择全选列
- showDelAll: true, //显示全删按钮
- showOperation: true, //是否显示操作列
- columns: [], //列名列值
- checkTemplate: '<input type="checkbox" >',
- delAllTemplate: '<input reset radius2" type="reset" value="删除" onsubmit="return false"><input type="hidden" >',
- operationTemplate: '<a href class="btn btn4 btn_pencil" data-toggle="tooltip" style="margin-left:5%" data-trigger="hover" title="编辑" ></a><a href class="btn btn4 btn_trash" style="margin-left:5%;" data-toggle="tooltip" data-trigger="hover" title="删除"></a>',
- expanderExpandedClass: 'glyphicon glyphicon-chevron-down', //展开的按钮的图标
- expanderCollapsedClass: 'glyphicon glyphicon-chevron-right', //缩起的按钮的图标
- getCheckbox: function () {
- return $(this).find('input[type="checkbox"]');
- },
- getDelAll: function () {
- return $(this).find('input[type="reset"]');
- },
- getTableHeader: function (treegridContainer) {
- var result = $.grep(treegridContainer.find('tr'), function (element) {
- var classNames = $(element).attr('class');
- var templateClass = /treegridExt-header/;
- return templateClass.test(classNames);
- });
- return $(result);
- },
- /*Event*/
- onCollpase: null,
- onExpand: null,
- onChange: null,
- onCheck: null
- };
- })(jQuery);
//jquery.treegridExt.css
.treegridExt-checkbox {}
.treegridExt-checkboxAll {}
.treegridExt-checked {background-color:transparent;}
.treegridExt-checkedAll { background-color:transparent;}
.treegridExt-partialChecked td { background-color: red; }
.treegrid-header {}
//前台HTMl
List.cshtml片段
<div class="contenttitle2">
<h3>查询结果</h3>
</div>
<form method="post" action="">
<table cellpadding="0" cellspacing="0" border="0" class="stdtable resultBox" id="dynTblList">
<colgroup>
<col class="con1" style="width: 5%" />
<col class="con0" style="width: 25%"/>
<col class="con1" style="width: 15%"/>
<col class="con0" style="width: 10%"/>
<col class="con1" style="width: 15%"/>
<col class="con0" style="width: 15%"/>
<col class="con1"/>
</colgroup>
</table>
</form>
</div> @section scripts{
<script type="text/javascript">
$(document).ready(function () {
$('#dynTblList').treegridExt({
idColumn: 'DictionaryId',
parentColumn: 'DictionaryParentId',
treeColumn: 0, //在哪一列上显示展开按钮
type: 'GET', //请求数据的ajax类型
url: '/Dictionary/GetSearchData', //请求数据的ajax的url
ajaxParams: {}, //请求数据的ajax的data属性
sortColumn: 'DictionarySeq',
striped: true, //是否各行渐变色
bordered: true, //是否显示边框
expandAll: false, //是否全部展开
columns: [
{
title: '字典项值',
field: 'DictionaryValue'
},
{
title: '字典项键',
field: 'DictionaryKey'
},
{
title: '字典项序号',
field: 'DictionarySeq'
},
{
title: '备注1',
field: 'DictionaryResrv1'
},
{
title: '备注2',
field: 'DictionaryResrv2'
}
]
});
});
</script>
}
相关图片, 就从treegrid的源码包里面找吧...
最终效果如下:
[原创] 扩展jquery-treegrid插件, 实现勾选功能和全删按钮.的更多相关文章
- JQuery表格插件DataTables 当前页合计功能
公司项目表格插件使用的是DataTables,最近添加表合计功能,发现百度统一都是如图类型的代码,不知道是配置问题还是怎么了,在我的页面下根本不能用 var addd=0; $(document).r ...
- 勾选checkbox之后,button按钮可用
js:function chkClick() { if (document.getElementById("chkBox").checked == true) { ...
- JQuery实现表格的全选和反选,以及分页勾选保存(laypage插件分页的使用)
需求: 1.全选与取消全选 2.单个勾选,点击表格单元格中checkbox勾选,也可以在点击行勾选,便与用户操作 3.分页勾选保存 4.固定表头 功能一: 说明:操作全选按钮的同时,遍历每一个tr中的 ...
- 获取EasyUI的treegrid的checkbox所有已勾选的数据
EasyUI为TreeGrid的已勾选节点,未勾选节点,只勾选部分子节点的父节点分别添加了三个不同的样式,如下:样式一:tree-checkbox2 有子节点被选中样式二:tree-checkbox1 ...
- 基于 jQuery Jcrop 插件的功能模块:头像剪裁
/** Jcrop version: 0.9.12 jQuery version: 1.9.0 Author: 小dee Date: 2014.10.30 */ 先看看他山之石:博客园的头像模块也是使 ...
- 为jQuery写插件
很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...
- 解决el-tree lazy懒加载时,连续勾选前两个子节点后第二次进入默认选中时,将父节点也勾选的问题
在用到el-tree的懒加载和默认勾选功能时,若第一次勾选前几个连续节点,第二次进入默认勾选时,由于el-tree子节点尚未完全加载(只加载出来前几个),默认勾选已经开始(已加载出来的子节点被默认勾选 ...
- AngularJS--购物车全选/取消全选功能实现
刚学习angularJS,于是练习写了一个类似于购物车的全选/取消全选的功能,主要实现的功能有: 1.勾选全选checkbox,列表数据全部被勾选,取消同理,用ng-model实现双向绑定: 2.选中 ...
- 解决jquery操作checkbox全选全不选无法勾选问题
最近在学习中使用jquery操作checkbox,使用下面方法进行全选.反选:$("input[name='checkbox']").attr("checked" ...
随机推荐
- PageHelper 自动去掉排序参数问题
PageHelper.startPage( req.getCurrent() , req.getSize() ,"ordersCreateDate desc" ); 如果 上面 ...
- update_engine-DownloadAction(二)
在update_engine-DownloadAction(一)中对DownloadAction介绍到了DeltaPerformer的Write方法.下面开始介绍Write方法. src/system ...
- Assets Library开发总结
Assets Library beta版的开发工作告一段落,本着有始有终的原则,这个项目还是需要做个总结的,恩~ 先甩一个链接:https://vimeo.com/238186671 考虑到该项目开发 ...
- 【C++】ubuntu中读取指定目录中的所有文件
摘要:ubuntu系统下,C++程序读取指定文件夹中多个文件,保存文件名列表.文件名没有规律且不考虑读取子文件夹中的文件. 系统配置:ubuntu16.04, cmake编译 首先安利一个函数,输入s ...
- JavaScript易混淆的零碎知识点积累
1.callee属性 和 caller属性. 区别:两者的调用对象不同 arguments.callee:指向拥有这个arguments对象的函数,在递归运算中经常用到. functionName.c ...
- scrapy爬虫框架学习笔记(一)
scrapy爬虫框架学习笔记(一) 1.安装scrapy pip install scrapy 2.新建工程: (1)打开命令行模式 (2)进入要新建工程的目录 (3)运行命令: scrapy sta ...
- gin的url查询参数解析
gin作为go语言最知名的网络库,在这里我简要介绍一下url的查询参数解析.主要是这里面存在一些需要注意的地方.这里,直接给出代码,和运行结果,在必要的地方进行分析. 代码1: type Struct ...
- su: Authentication failure问题
问题: su命令不能切换root,提示错误su: Authentication failure 解决: 使用命令 sudo passwd root 下次再su的时候只要输入密码就可以成功登录了.
- 五、使用druid管理数据库,mybatis连接mysql数据库
简介: 使用 mybatis 连接 mysql 数据库, 一套简单的增删改查流程, 前台用 bootstrap, bootstrap-table 框架, 最后用 druid 监控数据库连接情况 ...
- Hbase常见错误解决方法
Hbase常见错误解决方法 原文转载至:https://www.jianshu.com/p/5fd74812c56c 我是通过maven管理的依赖,直接修改maven依赖中hbase的版本就可以了 ...