构造带清除按钮的combo
效果图:
最近在做项目遇到。combo控件选择后触发事件的情况,用onSelect发现,没法选择空item
于是就想办法解决:
第一种方案:第一行增加空字符串文本的item?试试,绑定数据源的时候,增加了一个项,text和value都是"",结果发现,下拉panel中很难看,没有撑开到一定高度(可能跟span的innerHTML为空字符串有关,于是将text该为" "),这次倒是撑开了,结果:选中之后文本框的文本变成了" ",又不好对onClick事件进行修改(easyui封装好的)
第二种方案:又看到有个onChange事件,试试这个。。。。combobox按backspace键的时候还真触发了,可是发现,文本发生改变就立即触发该事件,但是在此处我需要执行的是grid重新加载数据(从服务端加载),而且combotree的文本框无法修改内容。。又宣告失败
实在没办法,去看combo的构造函数吧……,发现combo初始化的时候是增加了一个input(显示文本的)一个span(显示下拉图标的)还有一个hidden(显示选择项的value的)
那么只需要在span前边多增加一个span即可,给新增加的span增加点击事件:
还是不能对easyui代码进行修改,那只好重新写一个方法对dom进行修改了:
1 jQueryClearCombo = function (Combo) {
2 var combo = Combo.data().combo.combo;
3 var showClear = Combo.combo("options").showClear;
4 if (!showClear) {
5 showClear = Combo.attr("showClear");
6 }
7 var clear = combo.find(".combo-clear");
8 var text = combo.find(".combo-text");
9 if (!clear.hasClass("combo-clear")) {
10 if (showClear != "0") {
11 $(text).after("<span><span class=\"combo-clear\"></span></span>");
12 clear = combo.find(".combo-clear");
13 var w=clear.outerWidth();
14 text.width(text.width() - w);
15 clear.bind("click.combo", function () {
16 var v = "";
17 if (Combo.hasClass("easyui-combotree")) {
18 v = Combo.combotree("getValue");
19 Combo.combotree("setValue", "");
20 }
21 else if (Combo.hasClass("easyui-combobox")) {
22 v = Combo.combobox("getValue");
23 Combo.combobox("setValue", "");
24 }
25 var onClear = Combo.combo("options").onClear;
26 if (typeof (onClear) == "function") {
27 onClear(v, Combo);
28 }
29 }).bind("mouseenter.combo", function (a, b, c, d, e) {
30 $(this).addClass("combo-clear-hover");
31 }).bind("mouseleave.combo", function () {
32 $(this).removeClass("combo-clear-hover");
33 });
34 }
35 }
36 else if (showClear == "0") {
37 var w = clear.outerWidth()
38 text.width(text.width() + w);
39 combo.find("span:has(.combo-clear)").remove();
40 }
41 }
调用的时候,设置showClear属性为0 则不显示清除按钮,默认情况下是带清除按钮的
1 {
2 "onClear": function (v, e) {
3 errorMessage("点击了清除按钮,清除前值为:" + v);
4 },
5 "allowClick": function (node) {
6 return node.attributes.OrgType == "2";
7 }
8 }
如果需要监听清除按钮事件,构造combo的时候 设置一个onClear函数即可(第一个参数为删除之前的旧值,可判断旧值也为空的话,就表示值没发生改变不需要执行ajax代码;第二个为combo对象)
另外一个 combotree中,有些节点不可以单击选则,传递一个allowClick函数即可,参数为combotree所点击项的节点(node)
代码如下:
1 QueryComboTree = function (ComboObject, params) {
2 if (params == null) {
3 params = {};
4 }
5 var allowClick = params.allowClick, ErrorCallBack = params.onLoadError;
6 var url = $(ComboObject).attr("url");
7 if (url == null || url == "") {
8 url = getRootAjax("HRService")
9 + '?ClassName=HRService.PublicFunc&MethodName=ComboTreeJson&DictCode='
10 + ComboObject.attr("Code");
11 }
12 if ($(ComboObject).attr("onlyClickLeaf") == "1") {
13 params.allowClick = function (n) {
14 return $("").tree("isLeaf", n.target);
15 }
16 }
17 $.extend(params, {
18 url: url,
19 onLoadSuccess: function (response, json) {
20 SuccessOperation(response, json, function () {
21 jQueryClearCombo(ComboObject);
22 var op = ComboObject.combotree("options")
23 if (typeof (op.allowClick) == "function") {
24 var objTree = ComboObject.data().combotree.tree.data();
25 var oldClick = objTree.tree.options.onClick;
26 objTree.tree.options.onClick = function (node) {
27 if (op.allowClick(node)) {
28 oldClick(node);
29 }
30 else {
31 return;
32 }
33 }
34 }
35 });
36 },
37 onLoadError: function (response) {
38 ErrorOperation(response, ErrorCallBack);
39 }
40 });
41 ComboObject.combotree(params);
42 }