/** * jQuery EasyUI 1.3.6 * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved. * * Licensed under the GPL or commercial licenses * To use it on other terms please contact author: info@jeasyui.com * http://www.gnu.org/licenses/gpl.txt * http://www.jeasyui.com/license_commercial.php * * jQuery EasyUI tree Extensions 1.0 beta * jQuery EasyUI tree 组件扩展 * jeasyui.extensions.tree.js * 二次开发 流云 * 最近更新:2014-04-09 * * 依赖项: * 1、jquery.jdirk.js v1.0 beta late * 2、jeasyui.extensions.js v1.0 beta late * 3、jeasyui.extensions.menu.js v1.0 beta late * 4、jeasyui.extensions.panel.js v1.0 beta late * 5、jeasyui.extensions.window.js v1.0 beta late * 6、jeasyui.extensions.dialog.js v1.0 beta late * * Copyright (c) 2013-2014 ChenJianwei personal All rights reserved. * http://www.chenjianwei.org */ (function ($, undefined) { $.fn.tree.extensions = {}; /******************** initExtensions Methods Begin ********************/ function isRootNode(treeTarget, target) { var t = $(treeTarget); target = $(target)[0]; return $.array.contains(t.tree("getRoots"), target, function (t1, t2) { return t1.target == t2; }); }; function showOption(treeTarget, target) { var t = $(treeTarget), opts, pos; if (target) { target = $(target)[0]; opts = t.tree("getNode", target); pos = $(target).offset(); } else { opts = t.tree("options"); pos = t.offset(); } $.extend(pos, { left: pos.left + 25, top: pos.top + 15 }); $.easyui.showOption(opts, pos); }; function getLevel(treeTarget, target) { var t = $(treeTarget), node = $(target); if (!t[0] || !node[0] || !node.is(".tree-node[node-id]") || !$.contains(t[0], node[0])) { return 0; } return node.parentsUntil("ul.tree", "ul").length + 1; }; function moveNode(treeTarget, param) { if (!param || !param.source || !param.target || !param.point) { return; } if (!$.array.contains(["append", "top", "bottom"], param.point)) { param.point = "append"; } param.source = $(param.source)[0]; param.target = $(param.target)[0]; if (param.source == param.target) { return; } var t = $(treeTarget), opts = t.tree("options"); if ($.isFunction(opts.onBeforeDrop) && opts.onBeforeDrop.call(treeTarget, param.target, param.source, param.point) == false) { return; } if (t.tree("isParent", { target1: param.source, target2: param.target })) { return; } var node = t.tree("pop", param.source); switch (param.point) { case "append": t.tree("append", { parent: param.target, data: [node] }); break; case "top": t.tree("insert", { before: param.target, data: node }); break; case "bottom": t.tree("insert", { after: param.target, data: node }); break; default: t.tree("append", { parent: param.target, data: [node] }); break; } if (node && $.isFunction(opts.onDrop)) { opts.onDrop.call(treeTarget, param.target, param.source, param.point); } }; function shiftNode(treeTarget, param) { if (!param || !param.target || !param.point || !$.array.contains(["up", "upLevel", "down", "downLevel"], param.point)) { return; } param.target = $(param.target)[0]; var t = $(treeTarget), source = param.target, targetNode; switch (param.point) { case "up": targetNode = t.tree("prev", source); break; case "upLevel": targetNode = t.tree("getParent", source); break; case "down": targetNode = t.tree("next", source); break; case "downLevel": targetNode = t.tree("prev", source); break; default: break; } if (!targetNode) { return; } t.tree("move", { source: source, target: targetNode.target, point: param.point == "up" ? "top" : (param.point == "downLevel" ? "append" : "bottom") }); }; function compareNode(target, param) { if (isChild(target, param)) { return "child"; } if (isParent(target, param)) { return "parent"; } if (isSibling(target, param)) { return "sibling"; } return "normal"; }; function isChild(target, param) { var t = $(target), target1 = $(param.target1)[0], target2 = $(param.target2)[0]; var children = t.tree("getChildren", target2); return $.array.some(children, function (val) { return val.target == target1; }); }; function isParent(target, param) { var t = $(target), target1 = $(param.target1)[0], target2 = $(param.target2)[0]; var children = t.tree("getChildren", target1); return $.array.some(children, function (val) { return val.target == target2; }); }; function isSibling(target, param) { var t = $(target), target1 = $(param.target1)[0], target2 = $(param.target2)[0], p1 = t.tree("getParent", target1), p2 = t.tree("getParent", target2); return p1.target == p2.target; }; function getNextNode(treeTarget, target) { var item = $(target); if (!item.hasClass("tree-node")) { return null; } var target = item[0], next = item.closest("li").next().children("div.tree-node"); if (!next.length) { return null; } return next.length ? $(treeTarget).tree("getNode", next[0]) : null; }; function getPrevNode(treeTarget, target) { var item = $(target); if (!item.hasClass("tree-node")) { return null; } var target = item[0], prev = item.closest("li").prev().children("div.tree-node"); if (!prev.length) { return null; } return prev.length ? $(treeTarget).tree("getNode", prev[0]) : null; }; function getNears(treeTarget, target) { var t = $(treeTarget); target = $(target); if (!$.contains(t[0], target[0]) || !target.is("div.tree-node")) { return null; } return target.closest("ul").find("li>div.tree-node").map(function () { return t.tree("getNode", this); }); }; function getNearChildren(treeTarget, target) { var t = $(treeTarget); target = $(target); if (!$.contains(t[0], target[0]) || !target.is("div.tree-node")) { return null; } return target.siblings("ul").find("li>div.tree-node").map(function () { return t.tree("getNode", this); }); }; function unselect(treeTarget, target) { $(target).removeClass("tree-node-selected"); }; function remoteLoad(target, param) { var t = $(target); if (!param) { return t.tree("reload"); } if (typeof param == "string") { t.tree("options").url = param; return remoteLoad(target, {}); } var opts = t.tree("options"), queryParams = opts.queryParams; opts.queryParams = $.extend({}, queryParams, param); t.tree("reload"); }; function setNodeIcon(target, param) { if (!param || !param.target || !param.iconCls) { return; } $(target).tree("update", { target: param.target, iconCls: param.iconCls }) }; function setNodeText(target, param) { if (!param || !param.target || !param.text) { return; } $(target).tree("update", { target: param.target, text: param.text }) }; /******************** initExtensions Methods End ********************/ function initAutoToggle(t, opts, exts) { exts.onClickBak = opts.onClick; opts.onClick = function (node) { if ($.isFunction(exts.onClickBak)) { exts.onClickBak.apply(this, arguments); } if (opts.toggleOnClick) { t.tree("toggle", node.target); } }; }; function initContextMenu(t, opts, exts) { exts.onContextMenuBak = opts.onContextMenu; opts.onContextMenu = function (e, node) { if ($.isFunction(exts.onContextMenuBak)) { exts.onContextMenuBak.apply(this, arguments); } if (opts.selectOnContextMenu) { t.tree("select", node.target); } if (opts.enableContextMenu) { e.preventDefault(); var items = parseContextMenuItems(t, opts, e, node); if (opts.autoBindDblClick && opts.dblClickMenuIndex >= 0 && $.util.likeArray(opts.contextMenu) && !$.util.isString(opts.contextMenu) && opts.contextMenu.length > opts.dblClickMenuIndex) { items[opts.dblClickMenuIndex].bold = true; } $.easyui.showMenu({ items: items, left: e.pageX, top: e.pageY }); } }; }; function initBindDblClickEvent(t, opts, exts) { if (!$.array.likeArray(opts.contextMenu) || $.util.isString(opts.contextMenu) || !opts.contextMenu.length || !opts.autoBindDblClick) { return; } opts.onDblClickBak = opts.onDblClick; opts.onDblClick = function (node) { if ($.isFunction(exts.onDblClickBak)) { exts.onDblClickBak.apply(this, arguments); } var items = parseContextMenuItems(t, opts, null, node); if (opts.dblClickMenuIndex >= 0 && items.length > opts.dblClickMenuIndex) { var item = items[opts.dblClickMenuIndex], handler = item.handler || item || onclick; handler(null, node, t, item, null); } }; }; function parseContextMenuItems(t, opts, e, node) { var toggle = opts.toggleMenu, move = opts.moveMenu; if (typeof toggle == "object") { toggle = $.extend({}, { expand: true, expandAll: true, collapse: true, collapseAll: true, submenu: false }, toggle); } if (typeof move == "object") { move = $.extend({}, { up: false, upLevel: false, down: false, downLevel: false, submenu: false }, move); } var mExpandAll = { text: "展开当前所有", iconCls: "icon-metro-expand", disabled: !(toggle == true || toggle.expandAll == true), handler: function () { t.tree("expandAll", node.target); } }; var mExpand = { text: "展开当前", iconCls: "icon-metro-expand2", disabled: !(toggle == true || toggle.expand == true), handler: function () { t.tree("expand", node.target); } }; var mCollapse = { text: "折叠当前", iconCls: "icon-metro-contract2", disabled: !(toggle == true || toggle.collapse == true), handler: function () { t.tree("collapse", node.target); } }; var mCollapseAll = { text: "折叠当前所有", iconCls: "icon-metro-contract", disabled: !(toggle == true || toggle.collapseAll == true), handler: function () { t.tree("collapseAll", node.target); } }; var mUpLevel = { text: "上移一级", iconCls: "icon-standard-arrow-up", disabled: !(move == true || move.upLevel == true), handler: function () { t.tree("shift", { point: "upLevel", target: node.target }); } }; var mUp = { text: "上移", iconCls: "icon-standard-up", disabled: !(move == true || move.up == true), handler: function () { t.tree("shift", { point: "up", target: node.target }); } }; var mDown = { text: "下移", iconCls: "icon-standard-down", disabled: !(move == true || move.down == true), handler: function () { t.tree("shift", { point: "down", target: node.target }); } }; var mDownLevel = { text: "下移一级", iconCls: "icon-standard-arrow-down", disabled: !(move == true || move.downLevel == true), handler: function () { t.tree("shift", { point: "downLevel", target: node.target }); } }; var mOpts = { text: "显示 Option", iconCls: "icon-standard-application-form", disabled: !opts.showOption, children: [ { text: "树控件 Option", iconCls: "icon-hamburg-category", handler: function () { t.tree("showOption"); } }, { text: "该节点 Option", iconCls: "tree-icon tree-file", handler: function () { t.tree("showOption", node.target); } } ] }; var menus = []; var toggleMenu = [mExpandAll, mExpand, mCollapse, mCollapseAll], moveMenu = [mUpLevel, mUp, mDown, mDownLevel]; if (t.tree("isRoot", node.target)) { $.array.insertRange(toggleMenu, 0, [ { text: "展开所有", iconCls: "icon-standard-arrow-out", handler: function () { t.tree("expandAll"); } }, { text: "折叠所有", iconCls: "icon-standard-arrow-in", handler: function () { t.tree("collapseAll"); } }, "-" ]); } if ($.array.likeArray(opts.contextMenu)) { $.array.merge(menus, opts.contextMenu, "-"); } if (opts.showOption) { $.array.merge(menus, mOpts, "-"); } $.array.merge(menus, typeof toggle == "object" && !toggle.submenu ? $.array.merge(toggleMenu, "-") : [{ text: "展开/折叠", iconCls: "", disabled: !toggle, children: toggleMenu }, "-"]); $.array.merge(menus, typeof move == "object" && !move.submenu ? moveMenu : { text: "上/下移(级)", iconCls: "", disabled: !move, children: moveMenu }); return parseContextMenuMap(e, node, menus, t); }; function parseContextMenuMap(e, node, menus, t) { return $.array.map(menus, function (value) { if (!value || $.util.isString(value)) { return value; } var ret = $.extend({}, value); ret.id = $.isFunction(value.id) ? value.id.call(ret, e, node, t) : value.id; ret.text = $.isFunction(value.text) ? value.text.call(ret, e, node, t) : value.text; ret.iconCls = $.isFunction(value.iconCls) ? value.iconCls.call(ret, e, node, t) : value.iconCls; ret.disabled = $.isFunction(value.disabled) ? value.disabled.call(ret, e, node, t) : value.disabled; ret.hideOnClick = $.isFunction(value.hideOnClick) ? value.hideOnClick.call(ret, e, node, t) : value.hideOnClick; ret.onclick = $.isFunction(value.onclick) ? function (e, item, menu) { value.onclick.call(this, e, node, t, item, menu); } : value.onclick; ret.handler = $.isFunction(value.handler) ? function (e, item, menu) { value.handler.call(this, e, node, t, item, menu); } : value.handler; if (ret.children && ret.children.length) { ret.children = parseContextMenuMap(e, node, ret.children, t); } return ret; }); }; /******************** initExtensions Begin ********************/ var initExtensions = $.fn.tree.extensions.initExtensions = function (t, opts) { var exts = opts._extensions ? opts._extensions : opts._extensions = {}; if (exts._initialized) { return; } initAutoToggle(t, opts, exts); initContextMenu(t, opts, exts); initBindDblClickEvent(t, opts, exts); exts._initialized = true; }; var parseQueryParams = $.fn.tree.extensions.parseQueryParams = function (opts, param) { var ret = $.extend({}, param, opts.queryParams); return $.util.parseMapFunction(ret); }; var loader = $.fn.tree.extensions.loader = function (param, success, error) { var t = $(this), opts = t.tree("options"); initExtensions(t, opts); if (!opts.url) { return false; } param = parseQueryParams(opts, param); $.ajax({ type: opts.method, url: opts.url, data: param, dataType: "json", success: function (data) { success(data); }, error: function () { error.apply(this, arguments); } }); }; var _onExpand = $.fn.tree.defaults.onExpand; var onExpand = $.fn.tree.extensions.onExpand = function (node) { if ($.isFunction(_onExpand)) { _onExpand.apply(this, arguments); } var t = $(this), opts = t.tree("options"); if (opts.onlyNodeExpand) { var nodes = t.tree("getNears", node.target), animate = opts.animate opts.animate = false; $.each($.array.filter(nodes, function (val) { return val.target != node.target && val.state == "open"; }), function () { t.tree("collapse", this.target); }); opts.animate = animate; } }; var _loadFilter = $.fn.tree.defaults.loadFilter; var loadFilter = $.fn.tree.extensions.loadFilter = function (data, parent) { if ($.isFunction(_loadFilter)) { data = _loadFilter.apply(this, arguments); } data = $.array.likeArray(data) && !$.util.isString(data) ? data : []; if (!data.length) { return data; } var t = $(this), opts = t.tree("options"); return opts.dataPlain ? $.fn.tree.extensions.dataPlainConverter(data, opts) : data; }; /******************** initExtensions End ********************/ $.fn.tree.extensions.dataPlainConverter = function (data, opts) { data = data || []; var ret = data, idField = opts.idField || "id", parentField = opts.parentField || "pid"; if (opts.dataPlain) { var roots = $.array.filter(data, function (val) { if (val[parentField] == null || val[parentField] == undefined) { return true; } return !$.array.some(data, function (value) { return val[parentField] == value[idField]; }); }); var findChildren = function (array, value) { var temps = $.array.filter(array, function (val) { return val[parentField] == null || val[parentField] == undefined ? false : val[parentField] == value[idField]; }); return $.array.map(temps, function (val) { var children = findChildren(array, val); if (children.length) { val.children = $.array.likeArray(val.children) && !$.util.isString(val.children) ? val.children : []; $.array.merge(val.children, children); } return val; }); }; ret = $.array.map(roots, function (val) { var children = findChildren(data, val); if (children.length) { val.children = $.array.likeArray(val.children) && !$.util.isString(val.children) ? val.children : []; $.array.merge(val.children, children); } return val; }); } return ret; }; $.fn.tree.extensions.cascadeToArray = function (data) { if ($.util.isEmptyObjectOrNull(data)) { return []; } if (!$.util.likeArrayNotString(data)) { data = [data]; } var ret = [], getNodeArray = function (node) { var tmp = $.extend({}, node), array = [tmp]; if (!tmp.children || (tmp.children && !$.util.likeArrayNotString(tmp.children))) { return array; } $.each(tmp.children, function (i, n) { $.array.merge(array, getNodeArray(n)); }); tmp.children = undefined; return array; }; $.each(data, function (i, n) { $.array.merge(ret, getNodeArray(n)); }); return ret; }; var methods = $.fn.tree.extensions.methods = { // 扩展 easyui-tree 的自定义方法;判断制定的 tree-node 是否为根节点;该方法定义如下参数: // target: 用于判断的 tree-node 的 jQuery 或 DOM 对象。 // 返回值:如果指定的 jQuery 对象是该 easyui-tree 的根节点,则返回 true,否则返回 false。 isRoot: function (jq, target) { return isRootNode(jq[0], target); }, // 扩展 easyui-tree 的自定义方法;用于显示指定节点或树控件的属性信息;该方法定义如下参数: // target: 要显示属性信息的 tree-node 的 jQuery 或 DOM 对象;该参数可选;如果不定义该参数,则显示树控件的属性信息; // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 showOption: function (jq, target) { return jq.each(function () { showOption(this, target); }); }, // 扩展 easyui-tree 的自定义方法;用于获取指定节点的级别;该方法的参数 target 表示要获取级别的 tree-node 节点的 jQuery 或 DOM 对象; // 返回值:如果 target 表示的 DOM 对象存在于此 easyui-tree,则返回表示其所在节点级别的数字(从 1 开始计数),否则返回 0。 getLevel: function (jq, target) { return getLevel(jq[0], target); }, // 扩展 easyui-tree 的自定义方法;移动指定的节点到另一个位置;该方法定义如下参数: // param: 这是一个 JSON-Object,该对象定义如下属性: // target: 表示目标位置的 tree-node 的 jQuery 或 DOM 对象; // source: 表示要移动的 tree-node 的 jQuery 或 DOM 对象; // point: 表示移动到目标节点 target 的位置,String 类型,可选的值包括: // "append": 表示追加为目标节点 target 的子节点,默认值; // "top": 表示移动到目标节点 target 的上一格位置; // "bottom": 表示追加为目标节点 target 的下一格位置; // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 move: function (jq, param) { return jq.each(function () { moveNode(this, param); }); }, // 扩展 easyui-tree 的自定义方法;移动指定节点的位置;该方法定义如下参数: // param: 这是一个 JSON-Object,该对象定义如下属性: // target: 表示要移动的 tree-node 的 jQuery 或 DOM 对象; // point: 表示移动 target 的方式,String 类型,可选的值报错: // "up": 表示将 target 所表示的 tree-node 移动到上一格位置; // "upLevel": 表示将 target 所表示的 tree-node 移动到上一级的末尾; // "down": 表示将 target 所表示的 tree-node 移动到下一格位置; // "downLevel":表示将 target 所表示的 tree-node 移动到下一级的末尾; // 如果不定义该值或者该值为空或该值不是上面四个之一,则不进行任何操作; // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 shift: function (jq, param) { return jq.each(function () { shiftNode(this, param); }); }, // 扩展 easyui-tree 的自定义方法;判断两个 tree-node 之间的关系;该方法定义如下参数: // param: 这是一个 JSON-Object,该对象定义如下属性: // target1: 用于判断的第一个 tree-node 的 jQuery 或 DOM 对象; // target2: 用于判断的第二个 tree-node 的 jQuery 或 DOM 对象; // 返回值:返回一个 String 类型的值: // 如果 target1 是 target2 的子节点,则返回 "child"; // 如果 target1 是 target2 的父节点,则返回 "parent"; // 如果 target1 和 target2 是具有同一个父级节点的平级节点,则返回 "sibling"; // 如果 target1 和 target2 既不是父子级关系,也不是具有同一个父级节点的平级节点关系,则返回 "normal"; compare: function (jq, param) { return compareNode(jq[0], param); }, // 扩展 easyui-tree 的自定义方法;判断一个节点是否为另一个节点的子节点;该方法定义如下参数: // param: 这是一个 JSON-Object,该对象定义如下属性: // target1: 用于判断的第一个 tree-node 的 jQuery 或 DOM 对象; // target2: 用于判断的第二个 tree-node 的 jQuery 或 DOM 对象; // 返回值:如果 tree-node target1 是 tree-node target2 的子节点,则返回 true,否则返回 false。 isChild: function (jq, param) { return isChild(jq[0], param); }, // 扩展 easyui-tree 的自定义方法;判断一个节点是否为另一个节点的父节点;该方法定义如下参数: // param: 这是一个 JSON-Object,该对象定义如下属性: // target1: 用于判断的第一个 tree-node 的 jQuery 或 DOM 对象; // target2: 用于判断的第二个 tree-node 的 jQuery 或 DOM 对象; // 返回值:如果 tree-node target1 是 tree-node target2 的父节点,则返回 true,否则返回 false。 isParent: function (jq, param) { return isParent(jq[0], param); }, // 扩展 easyui-tree 的自定义方法;判断一个节点是否和另一个节点为具有同一个父节点的平级节点;该方法定义如下参数: // param: 这是一个 JSON-Object,该对象定义如下属性: // target1: 用于判断的第一个 tree-node 的 jQuery 或 DOM 对象; // target2: 用于判断的第二个 tree-node 的 jQuery 或 DOM 对象; // 返回值:如果 tree-node target1 和 tree-node target2 是具有同一个父级节点的平级节点,则返回 true,否则返回 false。 isSibling: function (jq, param) { return isSibling(jq[0], param); }, // 扩展 easyui-tree 的自定义方法;获取指定节点的平级下一格位置的 tree-node 节点;该方法定义如下参数: // target: 指定的表示 tree-node 的 jQuery 或 DOM 对象。 // 返回值:返回 tree-node target 的同级别下一格位置的 tree-node 节点 node 对象;该 node 对象含有如下属性: // id、text、iconCls、checked、state、attributes、target; // 如果该 tree-node target 为当前级别的最后一个节点即没有下一格节点;则返回 null。 next: function (jq, target) { return getNextNode(jq[0], target); }, // 扩展 easyui-tree 的自定义方法;获取指定节点的平级上一格位置的 tree-node 节点;该方法定义如下参数: // target: 指定的表示 tree-node 的 jQuery 或 DOM 对象。 // 返回值:返回 tree-node target 的同级别上一格位置的 tree-node 节点对象;该 tree-node 对象含有如下属性: // id、text、iconCls、checked、state、attributes、target; // 如果该 tree-node target 为当前级别的第一个节点即没有上一格节点;则返回 null。 prev: function (jq, target) { return getPrevNode(jq[0], target); }, // 扩展 easyui-tree 的自定义方法;获取指定节点的同级所有节点(包含自身);该方法定义如下参数: // target: 指定的表示 tree-node 的 jQuery 或 DOM 对象。 // 返回值:返回 tree-node target 的同级别(具有和当前 target 同一个父级节点)所有节点构成的一个数组对象; // 数组中每一个元素都是一个包含属性 id、text、iconCls、checked、state、attributes、target 的 tree-node 对象。 // 如果传入的参数 target 是根节点或者未定义 target 参数,则该方法和 getRoots 方法返回的值相同; // 如果传入的参数 target 不是一个 div.tree-node 或者其不包含在当前 easyui-tree 中,则返回 null。 getNears: function (jq, target) { return getNears(jq[0], target); }, // 扩展 easyui-tree 的自定义方法;获取指定节点的下一级所有节点;该方法定义如下参数: // target: 指定的表示 tree-node 的 jQuery 或 DOM 对象。 // 返回值:返回 tree-node target 的下一级所有节点构成的一个数组对象; // 数组中每一个元素都是一个包含属性 id、text、iconCls、checked、state、attributes、target 的 tree-node 对象。 // 如果传入的参数 target 没有子节点,则返回一个包含 0 个元素的数组。 // 如果传入的参数 target 不是一个 div.tree-node 或者其不包含在当前 easyui-tree 中,则返回 null。 // 备注:该方法和 getChildren 的不同之处在于,getChildren 方法返回的是 target 下的所有子节点内容; getNearChildren: function (jq, target) { return getNearChildren(jq[0], target); }, // 扩展 easyui-tree 的自定义方法;用于取消指定树节点的选择状态;该方法定义如下参数: // target: 指定的表示 tree-node 的 jQuery 或 DOM 对象。 // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 unselect: function (jq, target) { return jq.each(function () { unselect(this, target); }); }, // 扩展 easyui-tree 的自定义方法;请求远程服务器地址并加载数据,并将返回的数据设置为当前 easyui-tree 的节点数据集;该方法定义如下参数: // param:表示要进行远程请求的方式,该参数可以定义为以下类型: // String 类型值:表示作为远程数据请求的目标 url 地址; // JSON-Object 类型值:表示发送至远程服务器的查询参数; // 如果未定义参数 param,则相当于直接执行不带参数 { id } 的 reload 方法(reload 方法的执行默认会将指定节点的 id 作为参数发送到远程服务器地址)。 // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 load: function (jq, param) { return jq.each(function () { remoteLoad(this, param); }); }, // 扩展 easyui-tree 的自定义方法;设置指定节点的图标;该方法定义如下参数: // param: JSON-Object 类型值,该对象包含如下属性定义: // target: 表示要设置图标的 easyui-tree node HTML-DOM 对象; // iconCls:表示要设置的节点样式; // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 setIcon: function (jq, param) { return jq.each(function () { setNodeIcon(this, param); }); }, // 扩展 easyui-tree 的自定义方法;设置指定节点的显示文本;该方法定义如下参数: // param: JSON-Object 类型值,该对象包含如下属性定义: // target: 表示要设置图标的 easyui-tree node HTML-DOM 对象; // text : 表示要设置的显示文本值; // 返回值:返回表示当前 easyui-tree 组件的 jQuery 对象。 setText: function (jq, param) { return jq.each(function () { setNodeText(this, param); }); } }; var defaults = $.fn.tree.extensions.defaults = { // 增加 easyui-tree 的自定义扩展属性; // 该属性表示当设定了属性 contextMenu 时,是否将双击数据行 onDblClick 事件的响应函数 // 设置为 contextMenu 的第一个菜单项的点击响应函数,并将该菜单项的字体加粗; // Boolean 类型值,默认为 true; // 备注:当设置了自定义属性 contextMenu 时候,该功能方有效。 // 自动绑定的 onClick 的回调函数中将会调用 contextMenu 的第 "dblClickMenuIndex" 个菜单项的点击响应函数,但是回调函数中不能用到参数 e 和 menu。 autoBindDblClick: true, // 增加 easyui-tree 的自定义扩展属性; // 该属性表示当设定了属性 autoBindDblClick: true,双击行数据触发的右键菜单项事件的索引号; // 意即触发第几个右键菜单项上的事件。 // Number 类型值,从 0 开始计数,默认为 0; // 备注:当设置了自定义属性 autoBindDblClick: true 时,该功能方有效;如果此索引值超出菜单数量范围,则无效。 dblClickMenuIndex: 0, // 扩展 easyui-tree 的自定义属性,表示当前 easyui-tree 控件是否支持平滑数据格式。 // 当支持平滑数据格式时,数据元素中不需要通过指定 children 来指定子节点,而是支持通过 pid 属性来指示其父级节点。 // Boolean 类型值,默认为 false。 dataPlain: false, // 扩展 easyui-treegrid 的自定义属性,表示当前 easyui-treeg 控件支持平滑数据格式时,程序用哪个 field 表示当前行数据的父级节点 idField 值 // String 类型值,默认为 "pid"。 parentField: "pid", // 扩展 easyui-tree 的自定义属性,表示当右键点击 tree-node 时,是否自动选择被点击的 tree-node 对象; // Boolean 类型值,默认为 false; selectOnContextMenu: false, // 扩展 easyui-tree 的自定义属性,表示当左键点击带有子节点的条目时,是否自动展开/折叠相应节点。 // Boolean 类型,默认为 false。 // 备注:该功能不会影响到 easyui-tree 的原生事件 onClick。 toggleOnClick: false, // 扩展 easyui-tree 的自定义属性,表示同一级菜单节点下,只允许一个节点被展开。 // Boolean 类型,默认为 false。 // 当该属性设置为 true 时,建议同时把 animate 属性设置为 false,以免影响菜单联动折叠时的美观效果。 onlyNodeExpand: false, // 扩展 easyui-tree 的自定义属性,表示是否启用当前 easyui-tree 组件的右键菜单。 // Boolean 类型,默认为 true。 // 备注:该功能不会影响到 easyui-tree 的原生事件 onContextMenu。 enableContextMenu: true, // 扩展 easyui-tree 的自定义属性,表示当前 easyui-tree 的右键菜单; // 这是一个数组类型,数组中的每一个元素都是一个 JSON-Object,该 JSON-Object 定义如下属性: // id: 表示菜单项的 id; // text: 表示菜单项的显示文本; // iconCls: 表示菜单项的左侧显示图标; // disabled: 表示菜单项是否被禁用(禁用的菜单项点击无效); // hideOnClick: 表示该菜单项点击后整个右键菜单是否立即自动隐藏; // bold: Boolean 类型值,默认为 false;表示该菜单项是否字体加粗; // style: JSON-Object 类型值,默认为 null;表示要附加到该菜单项的样式; // handler: 表示菜单项的点击事件,该事件函数格式为 function(e, node, tree, item, menu),其中 this 指向菜单项本身 // 备注:当 enableContextMenu 属性设置为 true 时,该属性才有效。 // 备注:该功能不会影响到 easyui-tree 的原生事件 onContextMenu。 contextMenu: null, // 扩展 easyui-tree 的自定义属性,表示是否启用右键菜单中的“展开当前、折叠当前、展开当前所有、折叠当前所有”菜单项的功能; // 该属性可以定义为以下类型: // Boolean 类型,表示是否启用这四个菜单项; // JSON-Object 类型,该 JSON-Object 可以包含如下属性: // expand: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“展开当前”菜单; // expandAll: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“展开当前所有”菜单; // collapse: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“折叠当前”菜单; // collapseAll: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“折叠当前所有”菜单; // submenu: 表示这四个菜单项是否以子菜单方式呈现,默认为 true; // 上面四个属性,如果参数的值为函数,则函数的签名为 function(e, node, tree, item, menu)。 // 备注:当 enableContextMenu 属性设置为 true 时,该属性才有效。 // 这四个菜单点击时,会自动触发 easyui-tree 的折叠/展开菜单项的相应事件。 toggleMenu: true, // 扩展 easyui-tree 的自定义属性,表示是否启用右键菜单中的“上移、下移、上移一级、下移一级”菜单项的功能; // 备注:当 enableContextMenu 属性设置为 true 时,该属性才有效。 // 该属性可以定义为以下类型: // Boolean 类型,表示是否启用这四个菜单项,默认为 false; // JSON-Object 类型,该 JSON-Object 可以包含如下属性: // up: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“上移”菜单; // upLevel: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“上移一级”菜单; // down: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“下移”菜单; // downLevel: 布尔类型的值,也可是一个返回布尔值的函数,表示是否显示“下移一级”菜单; // submenu: 表示这四个菜单项是否以子菜单方式呈现,默认为 true; // 上面四个属性,如果参数的值为函数,则函数的签名为 function(e, node, tree, item, menu)。 // 这四个菜单点击时,会自动触发 easyui-tree 的 onDrop 事件。 moveMenu: false, // 扩展 easyui-tree 的自定义属性,该属性表示在启用右键菜单的情况下,右键菜单项中是否显示 "显示 Tree 的 Option" 菜单项 // Boolean 类型值;默认为 false。 showOption: false, // 表示当执行远程请求获取数据时,被一并发送到服务器的查询参数,参考 easyui-datagrid 中的 queryParams 属性定义; // 这是一个 JSON-Object 类型参数对象,其中每一个属性的值可以是值类型,也可以是返回值的函数。 queryParams: {}, // 覆盖 easyui-tree 的原生属性 loader,以支持相应扩展功能。 loader: loader, // 覆盖 easyui-tree 的原生属性 loadFilter,以支持相应扩展功能(支持平滑数据格式)。 loadFilter: loadFilter, // 覆盖 easyui-tree 的原生事件 onExpand,以支持相应扩展功能。 onExpand: onExpand }; $.extend($.fn.tree.defaults, defaults); $.extend($.fn.tree.methods, methods); })(jQuery);