[原创] 扩展jquery-treegrid插件, 实现勾选功能和全删按钮.

时间:2022-02-16 09:42:42

新上手一个项目, 因而正好想学习下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-treegrid插件, 实现勾选功能和全删按钮.的更多相关文章

  1. JQuery表格插件DataTables 当前页合计功能

    公司项目表格插件使用的是DataTables,最近添加表合计功能,发现百度统一都是如图类型的代码,不知道是配置问题还是怎么了,在我的页面下根本不能用 var addd=0; $(document).r ...

  2. 勾选checkbox之后,button按钮可用

    js:function chkClick() {    if (document.getElementById("chkBox").checked == true) {       ...

  3. JQuery实现表格的全选和反选,以及分页勾选保存(laypage插件分页的使用)

    需求: 1.全选与取消全选 2.单个勾选,点击表格单元格中checkbox勾选,也可以在点击行勾选,便与用户操作 3.分页勾选保存 4.固定表头 功能一: 说明:操作全选按钮的同时,遍历每一个tr中的 ...

  4. 获取EasyUI的treegrid的checkbox所有已勾选的数据

    EasyUI为TreeGrid的已勾选节点,未勾选节点,只勾选部分子节点的父节点分别添加了三个不同的样式,如下:样式一:tree-checkbox2 有子节点被选中样式二:tree-checkbox1 ...

  5. 基于 jQuery Jcrop 插件的功能模块:头像剪裁

    /** Jcrop version: 0.9.12 jQuery version: 1.9.0 Author: 小dee Date: 2014.10.30 */ 先看看他山之石:博客园的头像模块也是使 ...

  6. 为jQuery写插件

    很多场合,我们都会调用jQuery的插件去完成某个功能,比如slider. 如下图,做一个div,通过“$( "#slider" ).slider();”的方式直接将div变成sl ...

  7. 解决el-tree lazy懒加载时,连续勾选前两个子节点后第二次进入默认选中时,将父节点也勾选的问题

    在用到el-tree的懒加载和默认勾选功能时,若第一次勾选前几个连续节点,第二次进入默认勾选时,由于el-tree子节点尚未完全加载(只加载出来前几个),默认勾选已经开始(已加载出来的子节点被默认勾选 ...

  8. AngularJS--购物车全选&sol;取消全选功能实现

    刚学习angularJS,于是练习写了一个类似于购物车的全选/取消全选的功能,主要实现的功能有: 1.勾选全选checkbox,列表数据全部被勾选,取消同理,用ng-model实现双向绑定: 2.选中 ...

  9. 解决jquery操作checkbox全选全不选无法勾选问题

    最近在学习中使用jquery操作checkbox,使用下面方法进行全选.反选:$("input[name='checkbox']").attr("checked&quot ...

随机推荐

  1. iOS 10 跳转系统设置

    苦心人天不负, 为了项目终于把 iOS 10 跳转系统设置的方法给搞定了, 很欣慰. http://www.cnblogs.com/lurenq/p/6189580.html iOS 10 跳转系统设 ...

  2. Http协议与TCP协议简单理解

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

  3. 安装Golang 1&period;6及开发环境

    安装Golang 1.6及开发环境=====================================> 下载软件    * go1.4.2.linux-amd64.tar.gz     ...

  4. 最近学习java时的记录

    1.java 的变量一共分为三种,类变量,局部变量,成员变量 类变量就是 加static修饰符的变量 2.java 的修饰符可分为两大类,一 可访问修饰符 protected private publ ...

  5. 【Android Studio安装部署系列】二十六、Android studio录制屏幕并生成gif文件

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio自带录制屏幕功能,那么就可以很方便地将手机上的屏幕操作录制成视频.然后借助一些软件或者网站转换成gif文 ...

  6. Metasploit Framework(4)信息收集

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 使用场景: Kali机器一台:192.168.163. ...

  7. 信号基础知识---单频矩形脉冲信号CW

    %CW%参考:声呐技术 P27,31clc;close all;clear all;%参数-------------------------f0=50;T=0.1;%时宽B=1/T;fs=1000;% ...

  8. iOS开源项目周报0428

    由OpenDigg 出品的iOS开源项目周报第十八期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. Bouncy ...

  9. Dictionary CovertTo List

    示例代码 假设有如下一个Dictionary 要转换成List Dictionary<string, string> dicNumber = new Dictionary<strin ...

  10. order by name 注入

    order by name id id是一个注入点 可以利用if语句进行注入 order by name ,if(1=1,1,select 1 from information_schema.tabl ...