更新时间:2021-06-27 23:28:48
单选下拉框是系统开发中常用的组件,也是要求比较多的组件。最近就有一个项目各种改,一会儿要制定规则筛选匹配,一会儿要回车选中,一会儿要懒加载......与其网上各种搜合适的组件,不如自己写一个一劳永逸,更重要是的在功能实现上不受限于其他组件。该组件基于jquery开发,对单选下拉框功能进行整合,能够满足大部分功能需要。后续功能持续更新完善中。
支持自定义下拉框右侧图标,图标基于font字体库设计,目前提供了arrow(箭头)和triangle(三角)两种模式 ,可扩展。
支持自定义key,value字段名。
支持前端动态添加全部选项。
支持默认选中。
支持输入筛选功能。其中包括是否区分大小写,根据筛选规则(以指定字符串开始匹配、以指定字符串结束匹配、存在即匹配)进行匹配,下拉选项列表展示方式(输入前展示、输入后展示)。
支持回车选中。根据回车选中规则(全匹配、模糊匹配)进行匹配。
支持数据懒加载。
支持通过鼠标上下键控制选项。
提供了获取选中key、获取选中value、刷新下拉数据的方法。
提供了点击、回车选中时的回调方法。
this.defaultConfig = { // 默认父元素 parentEleClass: "selectSearchArea", // 后缀图标,默认arrow; // 目前提供arrow(箭头)和triangle(三角)两种模式,可根据项目情况自行拓展 // 拓展可以添加对应的font,提供一对class icon-${suffixIcon}-top && icon-${suffixIcon}-bottom suffixIcon: "arrow", // 下拉数组,用于下拉选项的显示 selectList: [], // 下拉选项key值字段, 默认key keyField: "key", // 下拉选项value值字段, 默认value valueField: "value", // 输入查询相关配置 searchSupportOption: { // 是否支持输入查询,默认支持,默认值true support: true, // 是否区分大小写进行匹配, 默认区分,默认值true sensitive: true, // 匹配方式 // start: 检测字符串是否以指定的子字符串开始 // end:检测字符串是否以指定的子字符串结束 // all: 检索字符串在整个查询中存在 matchedCondition: "all", // 输入为空时是否显示下拉选项 isViewItemsWhenNoInput: true, }, // 是否需要前端添加全部选项 isNeedAll: false, // 全部选项配置内容 allOptions: { // 全部选项key值,不能为空 allKeyData: "all", // 全部选项value值 allValueData: "全部", }, defaultSelect: "", // 回车相关配置 enterSelectSupportOption: { // 是否支持回车选中, 默认支持,默认值true support: true, // 支持回车选中情况下定义的选中规则, 默认值 part // 目前提供complete(完全匹配) 和 part(部分匹配)两种模式,已存在键盘上、下移键选中 // complete情况下会根据当前输入文本完全匹配下拉选项的文本,当存在多个选项匹配时,默认选中第一个 // part情况下会根据当前输入文本模糊匹配,当存在多个选项匹配时,默认选中第一个 // 优先级:已存在通过键盘上、下键选中的选项 > methods methods: "part", }, // 懒加载相关配置 lazyLoadSupportOption: { // 是否支持懒加载, 默认false support: false, // 下拉数量 total: 0, // 懒加载时调用的方法,由外部定义。需要返回一个Promise()对象,其中resolve()返回的必须是数组。 lazyloadCallback: () => {}, // 需要重新刷新数据时的回调方法,由外部定义。需要返回一个Promise()对象,其中resolve()返回的必须是数组 // 调用该方法时需要重置原引入文件中的js变量(分页等),返回刷新数据 reloadCallback: () => {} }, };
getKey():获取当前选中选项key值。
getValue():获取当前选中选项的value值。
setKey(): 给当前下拉框赋值,只能是存在的key值。
refresh(): 重置/刷新/清空列表方法,传入下拉选项数组。
setLazyLoadDataTotal():使用懒加载时给懒加载数量total赋值(一般情况下不需要用到)。
change(): 提供了点击、回车选中的回调方法,可用于外部的数据处理、页面刷新等。
引入jquery、/prod/css/multiFunctionSelect.css、/prod/font/iconfont.css,/prod/js/multiFunctionSelect.min.js。
<link rel="stylesheet" href="./font/iconfont.css"/> <link rel="stylesheet" href="./css/multiFunctionSelect.css" /> <script type="text/javascript" src="../lib/jquery/jquery-1.10.0.js"></script> <body> ... </dody> <script type="text/javascript" src="./dist/multiFunctionSelect.min.js"></script>
获取dom后调用MultiFunctionSelect传入对应参数即可。
var demo0 = $("#demo0").MultiFunctionSelect({ selectList: data1, keyField: "key", valueField: "value", searchSupportOption: { support: false } });
具体用法及实现demo见index.html
关于懒加载的设计,这里只提供了监听滚动条触底后动态添加dom的基础方法,数据结果完全由外部定义方法获取。
之前也有考虑过内置ajax然后完全由multiFunctionSelect内部做处理的方式,但是最后否决了,这样做有很多弊端。
1. 各项目对ajax的配置并非相同,例如请求头设置、参数设置等,并且部分项目返回xml、protobuf等数据格式需要进行二次处理,无法做到通用性。
2.避免不必要的数据交互,例如前端分页的实现,一次请求所有数据,懒加载时仅需要前端筛选。
3.更重要让使用者能自己进行更多的逻辑处理,不受限于该组件。
使用上也很简单,使用者仅需提供lazyloadCallback、reloadCallback两个方法以及total值即可。lazyloadCallback用于加载时提供相应数据,reloadCallback会在初始化时获取数据、以及输入时重置数据,并且重置外部定义的变量(例如分页等)。组件期望调用lazyloadCallback、reloadCallback方法后返回值是个Promise,multiFunctionSelect内部已经做了同步处理。
lazyloadCallback()、reloadCallback() 返回的数据格式为{ data: [], total: Number };
前端分页实现demo:
var dzdthList; function initSelectData = async function() { dzdthList = await getAllData(); var demo = $("#demo").MultiFunctionSelect({ lazyLoadSupportOption: { support: true, total: 0, lazyloadCallback: lazyloadCallback, reloadCallback: reloadCallback, } }) lazyloadOptions.total = dzdthList.length; } // 配置懒加载使用到的相关变量 var lazyloadOptions = { total: 0, pageSize: 50, pageNum: 1, curLoadData: [] } // 触底加载方法 function lazyloadCallback() { return new Promise(function(resolve) { lazyloadOptions.pageNum ++; var itemsArr = getSliceData(lazyloadOptions.curLoadData,(lazyloadOptions.pageNum - 1) * lazyloadOptions.pageSize , lazyloadOptions.pageNum * lazyloadOptions.pageSize); resolve({ data:itemsArr, total: lazyloadOptions.total }) }) } // 懒加载reload方法 function reloadCallback(innerText) { return new Promise(function(resolve) { lazyloadOptions.pageNum = 1; lazyloadOptions.curLoadData = innerText ? dzdthList.filter(item => item.ZBCJ.toLowerCase().indexOf(innerText.toLowerCase()) > -1) : dzdthList; lazyloadOptions.total = lazyloadOptions.curLoadData.length; var itemsArr = getSliceData(lazyloadOptions.curLoadData,0, lazyloadOptions.pageSize); resolve({ data:itemsArr, total: lazyloadOptions.total }) }) } // 数组分割方法 function getSliceData(arr, startIndex, endIndex) { return arr.slice(startIndex, endIndex) }
浏览器兼容上,已经适配了主流浏览器,例如谷歌、safari、360、火狐、IE10+等。
如果浏览器提示$(...).MultiFunctionSelect() is not a function 错误,请确认当前的$是否是已经添加方法的对象。
如有问题或者建议请联系, 邮箱:hviker2021@126.com