前言

  

扩展自$.fn.combo.defaults。使用$.fn.combobox.defaults重写默认值对象。下载该插件翻译源码

下拉列表框显示一个可编辑文本框和下拉式列表,用户可以选择一个值或多个值。用户可以直接输入文本到列表顶部或选择一个或多个当前列表中的值

依赖关系

  • combo

源码

/**
* jQuery EasyUI 1.3.2
*
*翻译:qq 1364386878
*/
(function ($) {
//设置下拉面板滚动条位置
function scrollTo(jq, value) {
var panel = $(jq).combo("panel");
var item = panel.find("div.combobox-item[value=\"" + value + "\"]");
if (item.length) {
if (item.position().top <= 0) {
var h = panel.scrollTop() + item.position().top;
panel.scrollTop(h);
} else {
if (item.position().top + item.outerHeight() > panel.height()) {
var h = panel.scrollTop() + item.position().top + item.outerHeight() - panel.height();
panel.scrollTop(h);
}
}
}
};
//小键盘向上选择操作
function _up(jq) {
var panel = $(jq).combo("panel");
var values = $(jq).combo("getValues");
//获取到combo值在下拉面板panel里面对应的item项的前一选项
var item = panel.find("div.combobox-item[value=\"" + values.pop() + "\"]");
if (item.length) {
var prevItem = item.prev(":visible");
if (prevItem.length) {
item = prevItem;//若有前一项,则item指向前一个选项
}
} else {
//若不存在前一项,则直接指向最后一个选项
item = panel.find("div.combobox-item:visible:last");
}
//获取上一选项的值
var value = item.attr("value");
_select(jq, value);
scrollTo(jq, value);
};
//小键盘向下选择操作
function _down(jq) {
var panel = $(jq).combo("panel");
var values = $(jq).combo("getValues");
//获取到combo值在下拉面板panel里面对应的item项的下一选项
var item = panel.find("div.combobox-item[value=\"" + values.pop() + "\"]");
if (item.length) {
var nextItem = item.next(":visible");//获取下一项
if (nextItem.length) {
item = nextItem;//若有下一项,则item指向下一个选项
}
} else {
//若不存在下一项,则直接指向第一个选项
item = panel.find("div.combobox-item:visible:first");
}
var value = item.attr("value");
_select(jq, value);
scrollTo(jq, value);
};
//选中指定值对应的选项
function _select(jq, value) {
var opts = $.data(jq, "combobox").options;
var data = $.data(jq, "combobox").data;
//重新设置combobox值(单选/多选)
if (opts.multiple) {
var values = $(jq).combo("getValues");
for (var i = 0; i < values.length; i++) {
if (values[i] == value) {
return;
}
}
//若指定值不在当前值中,则将指定值添加到combobox值数组中
values.push(value);
_setValues(jq, values);
} else {
_setValues(jq, [value]);
}
for (var i = 0; i < data.length; i++) {
if (data[i][opts.valueField] == value) {
opts.onSelect.call(jq, data[i]);
return;
}
}
};
//取消选择指定值的选项
function _unselect(jq, value) {
var opts = $.data(jq, "combobox").options;
var data = $.data(jq, "combobox").data;
var values = $(jq).combo("getValues");
for (var i = 0; i < values.length; i++) {
if (values[i] == value) {
values.splice(i, 1);
_setValues(jq, values);
break;
}
}
for (var i = 0; i < data.length; i++) {
if (data[i][opts.valueField] == value) {
opts.onUnselect.call(jq, data[i]);
return;
}
}
};
//设置combobox的值(数组)
function _setValues(jq, values, single) {
var opts = $.data(jq, "combobox").options;
var data = $.data(jq, "combobox").data;
var panel = $(jq).combo("panel");
//去掉当前值选项的选中样式
panel.find("div.combobox-item-selected").removeClass("combobox-item-selected");
var vv = [], ss = [];
for (var i = 0; i < values.length; i++) {
var v = values[i];
var s = v;
for (var j = 0; j < data.length; j++) {
if (data[j][opts.valueField] == v) {
s = data[j][opts.textField];
break;
}
}
vv.push(v);
ss.push(s);
panel.find("div.combobox-item[value=\"" + v + "\"]").addClass("combobox-item-selected");
}
$(jq).combo("setValues", vv);
if (!single) {
//多选,使用分隔符
$(jq).combo("setText", ss.join(opts.separator));
}
}; function transformData(jq) {
var options = $.data(jq, "combobox").options;
var values = [];
$(">option", jq).each(function () {
var value = {};
value[options.valueField] = $(this).attr("value") != undefined ? $(this).attr("value") : $(this).html();
value[options.textField] = $(this).html();
value["selected"] = $(this).attr("selected");
values.push(value);
});
return values;
};
//加载数据
function _loadData(jq, data, single) {
var options = $.data(jq, "combobox").options;
var panel = $(jq).combo("panel");
$.data(jq, "combobox").data = data;
var values = $(jq).combobox("getValues");
panel.empty();
//循环数据,给下拉面板添加选项
for (var i = 0; i < data.length; i++) {
var v = data[i][options.valueField];
var s = data[i][options.textField];
var item = $("<div class=\"combobox-item\"></div>").appendTo(panel);
item.attr("value", v);
if (options.formatter) {
item.html(options.formatter.call(jq, data[i]));
} else {
item.html(s);
}
//若选项定义为默认选中
if (data[i]["selected"]) {
(function () {
for (var i = 0; i < values.length; i++) {
if (v == values[i]) {
return;
}
}
values.push(v);
})();
}
}
//设置默认选中值数组values(单选/多选)
if (options.multiple) {
_setValues(jq, values, single);
} else {
if (values.length) {
_setValues(jq, [values[values.length - 1]], single);
} else {
_setValues(jq, [], single);
}
}
//触发onLoadSuccess事件
options.onLoadSuccess.call(jq, data);
//给下拉面板选项注册hover、click事件
$(".combobox-item", panel).hover(function () {
$(this).addClass("combobox-item-hover");
}, function () {
$(this).removeClass("combobox-item-hover");
}).click(function () {
var selectItem = $(this);
if (options.multiple) {
if (selectItem.hasClass("combobox-item-selected")) {
_unselect(jq, selectItem.attr("value"));
} else {
_select(jq, selectItem.attr("value"));
}
} else {
_select(jq, selectItem.attr("value"));
//单选时,选中一次就隐藏下拉面板
$(jq).combo("hidePanel");
}
});
};
//重新加载数据
function _reload(jq, url, paramData, single) {
var options = $.data(jq, "combobox").options;
if (url) {
options.url = url;
}
paramData = paramData || {};
if (options.onBeforeLoad.call(jq, paramData) == false) {
return;
}
options.loader.call(jq, paramData, function (data) {
_loadData(jq, data, single);
}, function () {
options.onLoadError.apply(this, arguments);
});
};
// 输入值匹配
function _query(jq, q) {
var options = $.data(jq, "combobox").options;
if (options.multiple && !q) {
_setValues(jq, [], true);
} else {
_setValues(jq, [q], true);
}
if (options.mode == "remote") {
_reload(jq, null, { q: q }, true);
} else {
var panel = $(jq).combo("panel");
panel.find("div.combobox-item").hide();
//获取combobox的数据
var data = $.data(jq, "combobox").data;
for (var i = 0; i < data.length; i++) {
if (options.filter.call(jq, q, data[i])) {
var v = data[i][options.valueField];
var s = data[i][options.textField];
var item = panel.find("div.combobox-item[value=\"" + v + "\"]");
item.show();
if (s == q) {
_setValues(jq, [v], true);
//选项设置为选中样式
item.addClass("combobox-item-selected");
}
}
}
}
}; function create(jq) {
var options = $.data(jq, "combobox").options;
$(jq).addClass("combobox-f");
$(jq).combo($.extend({}, options, {
onShowPanel: function () {
$(jq).combo("panel").find("div.combobox-item").show();
scrollTo(jq, $(jq).combobox("getValue"));
options.onShowPanel.call(jq);
}
}));
}; //初始化下拉框
$.fn.combobox = function (target, parm) {
if (typeof target == "string") {
var fn = $.fn.combobox.methods[target];
if (fn) {
return fn(this, parm);
} else {
return this.combo(target, parm);
}
}
target = target || {};
return this.each(function () {
var data = $.data(this, "combobox");
if (data) {
$.extend(data.options, target);
create(this);
} else {
data = $.data(this, "combobox", {
options: $.extend({},
$.fn.combobox.defaults,
$.fn.combobox.parseOptions(this), target)
});
create(this);
_loadData(this, transformData(this));
}
if (data.options.data) {
_loadData(this, data.options.data);
}
_reload(this);
});
};
//默认方法
$.fn.combobox.methods = {
//返回属性对象
options: function (jq) {
var options = $.data(jq[0], "combobox").options;
options.originalValue = jq.combo("options").originalValue;
return options;
},
//返回加载数据
getData: function (jq) {
return $.data(jq[0], "combobox").data;
},
//设置下拉列表框值数组
setValues: function (jq, values) {
return jq.each(function () {
_setValues(this, values);
});
},
//设置下拉列表框值数组
setValue: function (jq, value) {
return jq.each(function () {
_setValues(this, [value]);
});
},
//清除下拉列表框的值
clear: function (jq) {
return jq.each(function () {
$(this).combo("clear");
var panel = $(this).combo("panel");
panel.find("div.combobox-item-selected").removeClass("combobox-item-selected");
});
},
//重置
reset: function (jq) {
return jq.each(function () {
var options = $(this).combobox("options");
if (options.multiple) {
$(this).combobox("setValues", options.originalValue);
} else {
$(this).combobox("setValue", options.originalValue);
}
});
},
//读取本地列表数据
loadData: function (jq, data) {
return jq.each(function () {
_loadData(this, data);
});
},
//请求远程列表数据。通过'url'参数重写原始URL值
reload: function (jq, url) {
return jq.each(function () {
_reload(this, url);
});
},
//选择指定项
select: function (jq, value) {
return jq.each(function () {
_select(this, value);
});
},
//取消选择指定项
unselect: function (jq, value) {
return jq.each(function () {
_unselect(this, value);
});
}
}; //解析器配置
$.fn.combobox.parseOptions = function ( ) {
var t = $(target);
return $.extend({}, $.fn.combo.parseOptions(target),
$.parser.parseOptions(target, ["valueField", "textField", "mode", "method", "url"]));
};
//默认属性和事件 继承了comb的默认属性和事件
$.fn.combobox.defaults = $.extend({}, $.fn.combo.defaults, {
valueField: "value",//基础数据值名称绑定到该下拉列表框
textField: "text",//基础数据字段名称绑定到该下拉列表框
//定义了当文本改变时如何读取列表数据。设置为'remote'时,
//下拉列表框将会从服务器加载数据。当设置为“remote”模式时,用户输入将被发送到名为'q'的HTTP请求参数到服务器检索新数据
mode: "local",
method: "post",//通过URL加载远程列表数据
url: null,//HTTP方法检索数据(POST / GET)。
data: null,//数据列表加载 keyHandler: {
up: function () {
_up(this);//小键盘向上选择
},
down: function () {
_down(this);//小键盘向下选择
},
enter: function () {
var values = $(this).combobox("getValues");
$(this).combobox("setValues", values);
$(this).combobox("hidePanel");
},
query: function (q) {
_query(this, q);
}
},
// 定义当'mode'设置为'local'时如何过滤本地数据,函数有2个参数:
//q:用户输入的文本。
//row:列表行数据。
//返回true的时候允许行显示。
filter: function (q, row) {
var opts = $(this).combobox("options");
return row[opts.textField].indexOf(q) == 0;
},
//定义如何渲染行。该函数接受1个参数:row
formatter: function (row) {
var options = $(this).combobox("options");
return row[options.textField];
},
//定义了如何从远程服务器加载数据。返回false可以忽略该动作。该函数具备如下参数:
//param:传递到远程服务器的参数对象。
//success(data):在检索数据成功的时候调用该回调函数。
// error():在检索数据失败的时候调用该回调函数
loader: function (param, success, error) {
var options = $(this).combobox("options");
if (!options.url) {
return false;
}
$.ajax({
type: options.method,
url: options.url,
data: param,
dataType: "json",
success: function (data) {
success(data);
}, error: function () {
error.apply(this, arguments);
}
});
},
//在请求加载数据之前触发,返回false取消该加载动作
onBeforeLoad: function (param) {
},
//在加载远程数据成功的时候触发
onLoadSuccess: function () {
},
//在加载远程数据成功的时候触发
onLoadError: function () {
},
//在用户选择列表项的时候触发
onSelect: function (_5a) {
},
//在用户取消选择列表项的时候触发
onUnselect: function (_5b) {
}
});
})(jQuery);

示例代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Basic ComboBox - jQuery EasyUI Demo</title>
<link rel="stylesheet" type="text/css" href="../../themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="../../themes/icon.css">
<link rel="stylesheet" type="text/css" href="../demo.css">
<script type="text/javascript" src="../../jquery-1.8.0.min.js"></script>
<script src="../../plugins2/jquery.parser.js"></script>
<script src="../../plugins2/jquery.validatebox.js"></script>
<script src="../../plugins2/jquery.panel.js"></script>
<script src="../../plugins2/jquery.combo.js"></script>
<script src="../../plugins2/jquery.combobox.js"></script>
</head>
<body>
<h2>Basic ComboBox</h2>
<div class="demo-info" style="margin-bottom:10px">
<div class="demo-tip icon-tip"></div>
<div>Type in ComboBox to try auto complete.</div>
</div> <select class="easyui-combobox" name="state" style="width:200px;">
<option value="AL">Alabama</option>
<option value="AK">Alaska</option>
<option value="AZ">Arizona</option>
<option value="AR">Arkansas</option>
<option value="CA">California</option>
<option value="CO">Colorado</option>
<option value="CT">Connecticut</option>
<option value="DE">Delaware</option>
<option value="FL">Florida</option>
<option value="GA">Georgia</option>
<option value="HI">Hawaii</option>
<option value="ID">Idaho</option>
<option value="IL">Illinois</option>
<option value="IN">Indiana</option>
<option value="IA">Iowa</option>
<option value="KS">Kansas</option>
<option value="KY">Kentucky</option>
<option value="LA">Louisiana</option>
<option value="ME">Maine</option>
<option value="MD">Maryland</option>
<option value="MA">Massachusetts</option>
<option value="MI">Michigan</option>
<option value="MN">Minnesota</option>
<option value="MS">Mississippi</option>
<option value="MO">Missouri</option>
<option value="MT">Montana</option>
<option value="NE">Nebraska</option>
<option value="NV">Nevada</option>
<option value="NH">New Hampshire</option>
<option value="NJ">New Jersey</option>
<option value="NM">New Mexico</option>
<option value="NY">New York</option>
<option value="NC">North Carolina</option>
<option value="ND">North Dakota</option>
<option value="OH" selected>Ohio</option>
<option value="OK">Oklahoma</option>
<option value="OR">Oregon</option>
<option value="PA">Pennsylvania</option>
<option value="RI">Rhode Island</option>
<option value="SC">South Carolina</option>
<option value="SD">South Dakota</option>
<option value="TN">Tennessee</option>
<option value="TX">Texas</option>
<option value="UT">Utah</option>
<option value="VT">Vermont</option>
<option value="VA">Virginia</option>
<option value="WA">Washington</option>
<option value="WV">West Virginia</option>
<option value="WI">Wisconsin</option>
<option value="WY">Wyoming</option>
</select> </body>
</html>

插件效果

easyui源码翻译1.32--ComboBox(下拉列表框)的更多相关文章

  1. easyui源码翻译1.32+API翻译全篇导航 (提供下载源码)

    前言 EasyUI每个组件都会有 属性.方法.事件 属性 所有的属性都定义在jQuery.fn.{plugin}.defaults里面.例如,对话框属性定义在jQuery.fn.dialog.defa ...

  2. easyui源码翻译1.32--datagrid(数据表格)

    前言 此前网上有easyui1.25的源码  应该算是比较老的版本  之后又经历了1.26 . 1.3. 1.31. 1.32 .1.33.1.34  1.33开始支持css3 算是又一个转折  但是 ...

  3. easyui源码翻译1.32--ComboTree(树形下拉框)

    前言 扩展自$.fn.combo.defaults和$.fn.tree.defaults.使用$.fn.combotree.defaults重写默认值对象.下载该插件翻译源码 树形下拉框结合选择控件和 ...

  4. easyui源码翻译1.32--EasyLoader(简单加载)

    前言 扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3. ...

  5. easyui源码翻译1.32--Form(表单)

    前言 使用$.fn.form.defaults重写默认值对象下载该插件翻译源码 form提供了各种方法来操作执行表单字段,比如:ajax提交, load, clear等等.当提交表单的时候可以调用va ...

  6. easyui源码翻译1.32--Combo(自定义下拉框)

    前言 扩展自$.fn.validatebox.defaults.使用$.fn.combo.defaults重写默认值对象.下载该插件翻译源码 自定义下拉框显示一个可编辑的文本框和下拉面板在html页面 ...

  7. easyui源码翻译1.32--Draggable(拖动)

    前言 使用$.fn.draggable.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:qq 1364386878 --拖动 ...

  8. easyui源码翻译1.32--Droppable(放置)

    前言 使用$.fn.droppable.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:lbq --放置 拉伸 */ (fun ...

  9. easyui源码翻译1.32--Resizable(调整大小)

    前言 使用$.fn.resizable.defaults重写默认值对象 下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3.2 * *翻译:qq 1364386878 Resiz ...

随机推荐

  1. Hive体系结构介绍

    http://www.aboutyun.com/thread-6217-1-1.html   1.Hive架构与基本组成     下面是Hive的架构图. 图1.1 Hive体系结构     Hive ...

  2. GlusterFS集群文件系统概述

    http://blog.csdn.net/zonelan/article/details/8468383 1.      GlusterFS概述 GlusterFS是Scale-Out存储解决方案Gl ...

  3. C#学习笔记6:各种字符串问题

    1.字符串 逐字字符串字面量:字符串前加@,不仅将反斜杠当做普通字符来处理,而且还会逐字解释所有空白字符. 如: Class Triangle { Static void Main() { Syste ...

  4. Cordova+angularjs+ionic+vs2015开发(一)

    欢迎加群学习:457351423 这里有4000多部学习视频,涵盖各种技术,有需要的欢迎进群学习! 一.Windows环境配置 1.如果已经安装VS2015,打开[工具]-[选项]找到Cordova选 ...

  5. vs调试windows mobile程序时布署时间太长的解决办法

    vs调试windows mobile程序时布署时间太长的解决办法 1.VS平台上,选工具-选项-项目和解决方案-MS BUILD项目生成输出详细信息中选择“诊断”,目的是在调试窗口中看出哪个过程编译的 ...

  6. asp.net MVC URL路由入门指南

    asp.net MVC 的URL路由是一个非常强大的功能,而且有个优点:强大单不复杂.然而,目前我在网上看到的相关资料,却都仅仅提供一些示例,仅通过这些示例,初学者基本上不可能明白为什么要这么配置,更 ...

  7. Java实战之02Hibernate-07与效率性能相关配置

    十四.其他HIbernate配置(与效率,性能相关) 1.数据库连接池 Hibernate有默认的连接池,性能有问题,不适合实际应用,适合学习阶段.DriverManagerConnectionPro ...

  8. 373. Find K Pairs with Smallest Sums

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. 给你两个数组n ...

  9. 前端资源多个产品整站一键打包&包版本管理(三)—— gulp分流

    问题: 当我们一个工作台里面有好几个项目的时候,我们要为项目的前端资源进行打包,但是,gulpfile只有一个,如果我们把所有的打包都放在同一个文件里面,首先文件会越来越大,而且不便于管理,这时,我们 ...

  10. CANVAS运用-对图片的压缩上传(仅针对移动浏览器)

    最近在移动端设计头像上传功能时,原本是以<input type="file">直接通过formData上传,然而实际使用情况是:对于过大的图片(高像素手机所拍摄的照片等 ...