Select 下拉菜单
本框架对原生的select元素做了尽可能的美化处理,不加任何js依然表现出色。本框架对表单元素默认设置为宽100%,用户根据需要设置宽度。
02 | < option value = "北京" >北京</ option > |
03 | < option value = "上海" >上海</ option > |
04 | < option value = "重庆" >重庆</ option > |
07 | < div class = "ax-break" ></ div > |
09 | < select style = "width:120px;" > |
10 | < option value = "北京" >北京</ option > |
11 | < option value = "上海" >上海</ option > |
12 | < option value = "重庆" >重庆</ option > |
15 | < div class = "ax-break" ></ div > |
17 | < div class = "ax-form-group" > |
18 | < div class = "ax-flex-row" > |
19 | < div class = "ax-form-label" >单选美化:</ div > |
20 | < div class = "ax-form-con" > |
21 | < div class = "ax-form-input" > |
23 | < option value = "北京" >北京</ option > |
24 | < option value = "上海" >上海</ option > |
25 | < option value = "重庆" >重庆</ option > |
32 | < div class = "ax-break" ></ div > |
34 | < div class = "ax-form-group" > |
35 | < div class = "ax-flex-row" > |
36 | < div class = "ax-form-label" >多选美化:</ div > |
37 | < div class = "ax-form-con" > |
38 | < div class = "ax-form-input" > |
40 | < option value = "北京" >北京</ option > |
41 | < option value = "上海" >上海</ option > |
42 | < option value = "重庆" >重庆</ option > |
43 | < option value = "广州" >广州</ option > |
44 | < option value = "南宁" >南宁</ option > |
45 | < option value = "深圳" >深圳</ option > |
本框架的select默认高度是38px,可使用的尺寸有ax-xs(18px),ax-sm(28px)和ax-lg(48px)。
原生的下拉菜单不美观,而且在不同浏览器下有不同显示结果,为了保持风格统一改进体验,本框架摒弃了臃肿的choices.js
(v9.0.1),原生开发了select下拉选择插件,主要功能如下:
- 支持多种数据源,包括select、ul+li、datalist节点数据,本地json数据和异步json和sql数据
- 支持单选和多选
- 支持input模式添加、编辑和删除操作
- 支持四种尺寸,xs、sm、md和lg,以配合构建不同风格的表单
- 支持自动宽度和自定义宽度
- 支持模糊检索和精确检索
- 支持一维数组和二维数组,二维数组可对数据列表进行分组显示
- 可保存当前selected数据,初始化后展示保存前的selected状态
- 支持创建新选项和删除旧选项
- 支持新增selected项和移除selected项
插件运行方式有两种:
- ax*属性:对input或select标签使用
axSelect
属性即可按默认参数运行插件。
- js实例:通过
new axSelect('#ID')
方式创建实例运行。
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
16 | < div class = "ax-break-md" ></ div > |
18 | < div class = "ax-form-group" > |
19 | < div class = "ax-flex-row" > |
20 | < div class = "ax-form-label" >选择城市:</ div > |
21 | < div class = "ax-form-con" > |
22 | < div class = "ax-form-input" > |
-
1 | let city = document.querySelector( '#city' ); |
如果要设置选中有三个方法:
- 1、如果是从树节点获取数据,那么在选项写上
selected
属性即可
- 2、如果通过json获取数据那么可设置
selected:true
即可
- 3、通过参数selected设置禁用项,selected参数可使用的值如下:
- 一个数字,将从数据id进行查找
- 一个字符串包含带英文逗号的字符串,将分别从id、label和value进行查找
- 一个对象,类似{id:0,label:'北京'},将以比对属性值的方式进行查找
- 一个数组,数组中每一项可以是以上三种类型
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
07 | < option value = "北京" >北京</ option > |
08 | < option value = "上海" >上海</ option > |
09 | < option value = "重庆" selected>重庆</ option > |
如果需要禁止触发展开下拉菜单,可使用参数readonly:true
。
如果要禁用选项有三个方法:
- 1、如果是从树节点获取数据,那么在选项写上
disabled
属性即可
- 2、如果通过json获取数据那么可设置
disabled:true
即可
- 3、通过参数disabled设置禁用项,disabled参数可使用的值如下:
- 一个数字,将从数据id进行查找
- 一个字符串包含带英文逗号的字符串,将分别从id、label和value进行查找
- 一个对象,类似{id:0,label:'北京'},将以比对属性值的方式进行查找
- 一个数组,数组中每一项可以是以上三种类型
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >全部禁用:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < select axSelect = 'readonly:true' > |
07 | < option value = "北京" >北京</ option > |
08 | < option value = "上海" >上海</ option > |
09 | < option value = "重庆" >重庆</ option > |
15 | < div class = "ax-break" ></ div > |
16 | < div class = "ax-form-group" > |
17 | < div class = "ax-flex-row" > |
18 | < div class = "ax-form-label" >禁用选项:</ div > |
19 | < div class = "ax-form-con" > |
20 | < div class = "ax-form-input" > |
22 | < option value = "北京" >北京</ option > |
23 | < option value = "上海" >上海</ option > |
24 | < option value = "重庆" disabled>重庆</ option > |
数据列表每一项均有label
和value
属性,其中label属性是必须的,如果没有value那么将以label值作为value值进行输出;大多数情况label与value只是对应关系,并不一定是一致的,可以自定义value值。默认回显label值,如果需要指定回显属性可设置displayProp
,例如displayProp:'value'
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >定义value:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
07 | < option value = "BJ" >北京</ option > |
08 | < option value = "SH" >上海</ option > |
09 | < option value = "CQ" >重庆</ option > |
一条完整的选项可编辑的数据属性如下:
id
:自定义选项的id,如果不填则有插件自动生成,自动生成的第一项id随参数idStart
label
:自定义选项的可见文本,最终呈现在选项左侧
value
:自定义选项的value值,如果不填将等于label
tip
:自定义选项的提示文本,最终呈现在选项右侧
legend
:自定义选项的图标,为class类,例如“ax-icon-star”
image
:自定义选项的小图片,为图片地址
selected
:设置选项的默认selected状态
disabled
:设置选项的默认disabled状态
数据渲染完毕还会自动添加上node(数据源的项目节点)和dom(下拉列表项目节点)属性。
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >定义选项:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
07 | < option tip = "首都" legend = "ax-icon-star" >北京</ option > |
08 | < option tip = "金融中心" image="<?=$public?>images/head01.jpg">上海</ option > |
09 | < option selected>重庆</ option > |
13 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "viewList" >查看选项数据</ a > |
-
1 | let listIns = new axSelect( '#listIns' , { idStart: 11 }), |
2 | viewList = document.querySelector( '#viewList' ); |
3 | viewList.onclick = () => { |
4 | console.log(listIns.data); |
本插件可绑定两种节点元素,分别是select
和input
。绑定select之后将直接从select的选项中获取数据;而绑定input则需要从外部获取数据,插件绑定input则自动是多选模式。以上演示了select绑定插件,以下演示input绑定插件。
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >绑定input:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" axSelect = "content:'#dataSelet'" /> |
11 | < select id = "dataSelet" style = "display: none;" > |
12 | < option value = "北京" >北京</ option > |
13 | < option value = "上海" >上海</ option > |
14 | < option value = "重庆" >重庆</ option > |
对于绑定select元素而言,option使用optgroup
包裹即可实现分组。
如果从ul+li获取数据,通过
ul+li的父子关系也自然形成分组;如果从datalist获取数据,datalist若存在optgroup
节点也可形成分组;如果从json取得数据,如果有children
属性也会形成分组。
02 | < optgroup label = "直辖市" > |
03 | < option value = "北京" >北京</ option > |
04 | < option value = "上海" >上海</ option > |
05 | < option value = "重庆" >重庆</ option > |
07 | < optgroup label = "广东省" > |
08 | < option value = "深圳" >深圳</ option > |
09 | < option value = "广州" >广州</ option > |
10 | < option value = "珠海" >珠海</ option > |
11 | < option value = "惠州" >惠州</ option > |
13 | < optgroup label = "湖南省" > |
14 | < option value = "长沙" >长沙</ option > |
15 | < option value = "株洲" >株洲</ option > |
16 | < option value = "岳阳" >岳阳</ option > |
17 | < option value = "张家界" >张家界</ option > |
19 | < optgroup label = "江西省" > |
20 | < option value = "南昌" >南昌</ option > |
21 | < option value = "赣州" >赣州</ option > |
22 | < option value = "宜春" >宜春</ option > |
23 | < option value = "九江" >九江</ option > |
对于绑定select元素而言,对select使用multiple
属性即可实现多选;对于绑定input元素而言,则自动是多选。可配合常用参数使用:
- least:至少选择几项,默认不限制,一般不用
- most:最多能选几项,默认不限制
01 | < select axSelect multiple> |
02 | < optgroup label = "直辖市" > |
03 | < option value = "北京" >北京</ option > |
04 | < option value = "上海" >上海</ option > |
05 | < option value = "重庆" >重庆</ option > |
07 | < optgroup label = "广东省" > |
08 | < option value = "深圳" >深圳</ option > |
09 | < option value = "广州" >广州</ option > |
10 | < option value = "珠海" >珠海</ option > |
11 | < option value = "惠州" >惠州</ option > |
13 | < optgroup label = "湖南省" > |
14 | < option value = "长沙" >长沙</ option > |
15 | < option value = "株洲" >株洲</ option > |
16 | < option value = "岳阳" >岳阳</ option > |
17 | < option value = "张家界" >张家界</ option > |
19 | < optgroup label = "江西省" > |
20 | < option value = "南昌" >南昌</ option > |
21 | < option value = "赣州" >赣州</ option > |
22 | < option value = "宜春" >宜春</ option > |
23 | < option value = "九江" >九江</ option > |
本插件支持多种数据源:
- 1、物理节点数据,可从select、ul+li和datalist中获取数据,通过
content
参数设为#id、.classname或节点
- 2、将当页的json数组数据,有
children
属性将被定义为parent对象,通过content设置json文件地址,并将async参数设为true
- 3、异步的json文件或sql数据库数据,有children属性将被定义为parent对象,通过
content
设置j动态页面地址,并将async
参数设为true
本数据中的可设置属性包括id、label、value、tip、selected、disabled、children、legend和image;通常id由插件自动创建;如果使用了children属性表名该节点将作为分组父节点存在。
以上示例已经演示了从select中获取数据,以下演示其他获得数据的方法。
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >ul+li:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" axSelect = "content:'#dataUl'" /> |
11 | < ul id = "dataUl" style = "display:none;" > |
12 | < li >< i value = "北京" >北京</ i ></ li > |
13 | < li >< i value = "上海" >上海</ i ></ li > |
14 | < li >< i value = "重庆" >重庆</ i ></ li > |
17 | < div class = "ax-break-md" ></ div > |
19 | < div class = "ax-form-group" > |
20 | < div class = "ax-flex-row" > |
21 | < div class = "ax-form-label" >datalist:</ div > |
22 | < div class = "ax-form-con" > |
23 | < div class = "ax-form-input" > |
24 | < input type = "text" axSelect = "content:'#dataList'" /> |
29 | < datalist id = "dataList" > |
30 | < option value = "北京" >北京</ option > |
31 | < option value = "上海" >上海</ option > |
32 | < option value = "重庆" >重庆</ option > |
35 | < div class = "ax-break-md" ></ div > |
37 | < div class = "ax-form-group" > |
38 | < div class = "ax-flex-row" > |
39 | < div class = "ax-form-label" >json数组:</ div > |
40 | < div class = "ax-form-con" > |
41 | < div class = "ax-form-input" > |
42 | < input type = "text" id = "arrIns" /> |
48 | < div class = "ax-break-md" ></ div > |
50 | < div class = "ax-form-group" > |
51 | < div class = "ax-flex-row" > |
52 | < div class = "ax-form-label" >异步json:</ div > |
53 | < div class = "ax-form-con" > |
54 | < div class = "ax-form-input" > |
55 | < input type = "text" id = "jsonIns" /> |
61 | < div class = "ax-break-md" ></ div > |
63 | < div class = "ax-form-group" > |
64 | < div class = "ax-flex-row" > |
65 | < div class = "ax-form-label" >异步sql:</ div > |
66 | < div class = "ax-form-con" > |
67 | < div class = "ax-form-input" > |
68 | < input type = "text" id = "sqlIns" /> |
-
02 | { id: 0, label: '北京' , value: '北京' }, |
03 | { id: 1, label: '上海' , value: '上海' }, |
04 | { id: 2, label: '重庆' , value: '重庆' }, |
06 | new axSelect( '#arrIns' , { |
09 | new axSelect( '#jsonIns' , { |
10 | content: 'ajax/cities.json' , |
13 | new axSelect( '#sqlIns' , { |
14 | content: 'ajax/citiesSql.php' , |
-
-
02 | header( "Content-Type:text/plain;charset=utf-8" ); |
09 | $connect = mysql_connect( $server , $username , $password ) or die ( "数据库链接错误" ); |
10 | mysql_select_db( $database , $connect ); |
11 | mysql_query( "set names 'utf8'" ); |
14 | $sqlString = "select id,pId,label,value,tip,disabled,selected from {$table}" ; |
15 | $sql =mysql_query( $sqlString ); |
19 | while ( $row = mysql_fetch_object( $sql )){ |
22 | $rows2 =mysql_query( "select id,pId from {$table} where pId={$row->id}" ); |
23 | if (mysql_num_rows( $rows2 ) > 0){ |
24 | $row ->children = array (); |
27 | array_push ( $result , $row ); |
29 | $success = json_encode( $result ); |
中国若干城市列表sql文件请点击这里下载。
下拉菜单默认宽度即是popup的默认宽度,如果需要自定义宽度有两个方法:
- 对select或input直接写上
style
样式,比如style="width:100px;"
- js调用的时候,对实例使用
width
参数,比如width:'100px'
如果同时使用了以上两个方法,则以参数width为准
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >style宽度:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < select axSelect style = "width:300px" > |
07 | < option value = "北京" >北京</ option > |
08 | < option value = "上海" >上海</ option > |
09 | < option value = "重庆" >重庆</ option > |
16 | < div class = "ax-break" ></ div > |
18 | < div class = "ax-form-group" > |
19 | < div class = "ax-flex-row" > |
20 | < div class = "ax-form-label" >参数width:</ div > |
21 | < div class = "ax-form-con" > |
22 | < div class = "ax-form-input" > |
23 | < select axSelect = 'width:"250px"' > |
24 | < option value = "北京" >北京</ option > |
25 | < option value = "上海" >上海</ option > |
26 | < option value = "重庆" >重庆</ option > |
使用search
参数可配置搜索功能,其有多个属性:
enable
:是否开启搜索功能,默认是false,可使用true开启
fuzzy
:是否使用模糊搜索,默认true(input中的value将以空格分割多个关键字进行检索),可选择false精确搜索(input中的value将作为一个关键字进行检索)
limit
:是否限制检索结果数量,默认为0不限制,可自定义限制数量
reorder
:是否对检索结果按权重进行高低排序,默认false按原顺序,可选择true进行权重重排
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < select axSelect = 'search:{enable:true}' > |
07 | < option value = "北京" >首都北京是中国历史文化名城</ option > |
08 | < option value = "上海" >魔都上海是中国金融和贸易中心</ option > |
09 | < option value = "重庆" >山城重庆是长江上游经济中心</ option > |
10 | < option value = "深圳" >鹏城深圳是中国最具经济活力的城市</ option > |
11 | < option value = "广州" >羊城广州是都市核心圈城市</ option > |
如果绑定元素是input的话可设置search.enable
,启用之后除了可进行检索之外还可编辑当前的selected值,通过delete
删除键删除最后一项,通过enter
回车键创建新的selected项。
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" value = "北京,上海,重庆" axSelect = 'search:{enable:true}' /> |
当检索出列表时,回车键可将列表中的项添加为selected项(先用上下箭头移动到列表中);当没有检索结果时可直接使用回车键将当前搜索框中的文本添加为selected项,这里便发生了一个问题,如果列表中的label是“上海”,搜索框中输入“上”或者“海”都能找出来这个条信息,此时使用回车键只能将“上海”添加为selected项,无法将“上”或者“海”添加为selected项;如果需要添加label中的子字符,需要禁用下拉列表的回车添加功能。
enterSelect
参数的意思是在下拉列表中使用上下箭头选择项目之后可使用回车键将该项目添加为selected项,默认true,可通过设为false禁用。
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" value = "北京,上海,重庆" axSelect = 'search:{enable:true},enterSelect:false' /> |
如果绑定input,而且只希望使用关键字检索,不使用删除和添加等编辑功能,可将search.editable
设为false。
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" value = "北京,上海,重庆" axSelect = 'search:{enable:true},enterSelect:false' /> |
如果不需要下拉菜单,只是绑定input进行手动添加和删除操作,可将参数dropdownShow
设为false。
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >无默认值:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" axSelect = "dropdownShow:false,search:{enable:true}" /> |
12 | < div class = "ax-break" ></ div > |
14 | < div class = "ax-form-group" > |
15 | < div class = "ax-flex-row" > |
16 | < div class = "ax-form-label" >默认selected值:</ div > |
17 | < div class = "ax-form-con" > |
18 | < div class = "ax-form-input" > |
19 | < input type = "text" id = "inlineIns" /> |
-
01 | new axSelect( '#inlineIns' , { |
03 | { id: 0, label: '北京' , value: '北京' }, |
04 | { id: 1, label: '上海' , value: '上海' , selected: true }, |
05 | { id: 2, label: '重庆' , value: '重庆' , selected: true }, |
本框架对select下拉菜单支持四种尺寸,分别是ax-xs
(高22px)、ax-sm
(高28px)、ax-md
(高38px,默认)和ax-lg
(高48px),使用size属性即可实现;如果是ax-form-group组合菜单,请同时给组合菜单追加尺寸类。
特小尺寸:
请选择...
请选择...
小型尺寸:
请选择...
请选择...
小型尺寸:
请选择...
请选择...
大型尺寸:
请选择...
请选择...
03 | < span class = "ax-gutter" ></ span > |
05 | < select axSelect = 'size:"xs"' > |
06 | < option value = "xs" >ax-xs(18px)</ option > |
07 | < option value = "北京" >北京</ option > |
08 | < option value = "上海" >上海</ option > |
09 | < option value = "重庆" >重庆</ option > |
12 | < span class = "ax-gutter" ></ span > |
14 | < select axSelect = 'size:"xs"' multiple> |
15 | < option value = "xs" >ax-xs(18px)</ option > |
16 | < option value = "北京" >北京</ option > |
17 | < option value = "上海" >上海</ option > |
18 | < option value = "重庆" >重庆</ option > |
23 | < div class = "ax-break" ></ div > |
27 | < span class = "ax-gutter" ></ span > |
29 | < select axSelect = 'size:"sm"' > |
30 | < option value = "xs" >ax-sm(22px)</ option > |
31 | < option value = "北京" >北京</ option > |
32 | < option value = "上海" >上海</ option > |
33 | < option value = "重庆" >重庆</ option > |
36 | < span class = "ax-gutter" ></ span > |
38 | < select axSelect = 'size:"sm"' multiple> |
39 | < option value = "xs" >ax-sm(22px)</ option > |
40 | < option value = "北京" >北京</ option > |
41 | < option value = "上海" >上海</ option > |
42 | < option value = "重庆" >重庆</ option > |
47 | < div class = "ax-break" ></ div > |
51 | < span class = "ax-gutter" ></ span > |
54 | < option value = "md" >ax-md(38px)</ option > |
55 | < option value = "北京" >北京</ option > |
56 | < option value = "上海" >上海</ option > |
57 | < option value = "重庆" >重庆</ option > |
60 | < span class = "ax-gutter" ></ span > |
62 | < select axSelect multiple> |
63 | < option value = "md" >ax-md(38px)</ option > |
64 | < option value = "北京" >北京</ option > |
65 | < option value = "上海" >上海</ option > |
66 | < option value = "重庆" >重庆</ option > |
71 | < div class = "ax-break" ></ div > |
75 | < span class = "ax-gutter" ></ span > |
77 | < select axSelect = 'size:"lg"' > |
78 | < option value = "lg" >ax-lg(48px)</ option > |
79 | < option value = "北京" >北京</ option > |
80 | < option value = "上海" >上海</ option > |
81 | < option value = "重庆" >重庆</ option > |
84 | < span class = "ax-gutter" ></ span > |
86 | < select axSelect = 'size:"lg"' multiple> |
87 | < option value = "lg" >ax-lg(48px)</ option > |
88 | < option value = "北京" >北京</ option > |
89 | < option value = "上海" >上海</ option > |
90 | < option value = "重庆" >重庆</ option > |
本插件有系列内部成员变量和内部操作方法,用户根据这些变量和方法可以自由操作实例,据此可方便与其他组件进行交互。请按下F12按键打开浏览器控制台来观摩以下实例。
内部成员变量如下:
this.selected
:当前下拉菜单数据中的selected状态项,是数组
this.value
:当前selected状态项的文本值,以英文逗号隔开
this.inputDom
:绑定的select或input节点
this.tagsDom
:selected标签节点,即ax-tags
this.listDom
:下拉列表数据的节点
this.inputType
:绑定表单元素节点类型,有三种:select-single、select-multiple和input
this.maxIndex
:当前最大索引值
this.selectDom
:选择器主体节点,即ax-select节点
this.clearDom
:清除所有selected项的节点
this.arrowDom
:下拉菜单的箭头指示节点
this.searchDom
:关键字搜索框节点
this.wrapperDom
:下拉菜单外层节点
this.popupIns
:下拉菜单popup实例,可使用axPopup的方法和变量
this.tagsIns
:selected项的tags实例,可使用axTag的方法和变量
this.destroyed
:销毁状态
this.data
:下拉列表的数据,数组格式,每一项均可能包含以下属性:
- id:数据编号,可以是数字也可以是uuid类的字符串
- label:选项展示的文本
- value:选项的值,如果为空将以label作为value输出
- tip:选项提示文字,放于选项右侧
- children:子元素合集,如果选项有该属性,说明该选项为分组父项
- selected:选项的是否为selected状态,选中该选项才有该属性
- disabled:选项是否为disabled状态,该选项设为disabled才有该属性
- active:第列表使用上下箭头选择之后才可能有该属性
- dom:下拉列表的li节点
- node:数据源的项目节点,比如说数据来自ul+li,那么该值为原li节点
this.searchResult
:搜索结果数据,是this.data的子集
内部操作方法如下:
this.add(data, placement, callback)
:增加新选项,支持两个参数
- data:添加的新选项内容,支持三种格式
- 一个字符串,包含带英文逗号的字符串(添加多项)
- 一个对象,对象的可用属性包括:id、label、value、tip
- 一个数组,以上两种类型数组(添加多项)
- placement:添加位置,默认end在列表尾部添加,可选择start在最前方添加
- callback:回调函数,添加后执行,支持一个参数即当前新增加的项目数组
this.arrAdd(data, placement)
:增加新选项(指定数据),支持两个参数
- data:添加的新选项内容,必须是对象数组数据,每一项包含的属性有id、label和value(不必须),例如[{id:5,label:'北京'}]
- placement:添加位置,默认end在列表尾部添加,可选择start在最前方添加
this.remove(data, callback)
:删除选项,支持两个参数
- data:删除的选项内容,支持四种格式:
- 一个数字,将从id中查找删除项
- 一个字符串,包含带英文逗号的字符串(添加多项)
- 一个对象,对象的可用属性包括:id、label、value、tip
- 一个数组,以上三种类型数组(添加多项)
- callback:回调函数,删除后执行,支持一个参数即当前新删除的项目数组
this.arrRemove(data)
:删除选项(指定数据),支持一个参数
- data:删除的选项内容,必须是来自this.data中的数据即this.data的子集
this.select(data, callback)
:增加selected值,支持两个:
- data:用法同remove方法
- callback:回调函数,selected后执行,支持一个参数即当前新selected的项目数组
this.unselect(data, callback)
:取消selected值,支持两个:
- data:用法同remove方法
- callback:回调函数,取消selected后执行,支持一个参数即当前取消selected的项目数组
this.update(setting, callback)
:更新插件参数,支持两个:
- setting:将要更新的参数
- callback:回调函数,更新后执行,无参数
this.readonly(callback)
:设置只读,支持回调函数,回调无参数
this.readable(callback)
:设置可读,支持回调函数,回调无参数
this.clear(callback)
:取消所有selected值,支持回调函数,回调无参数
this.destroy(callback)
:销毁实例,支持回调函数,回调无参数
this.save(setting,callback)
:保存参数到本地(基于localstorage),参数说明如下:
- setting:保存的参数,支持两种格式:
- 为空,将保持当前选项和数据
- 对象格式,比如setting={selected:1,diabled:3}
- callback:回调函数,支持一个参数即localstorage值:
-
01 | < select id = "methodIns" multiple> |
07 | < div class = "ax-break" ></ div > |
09 | < a href = "###" class = "ax-btn ax-primary" id = "add" >添加选项</ a > |
10 | < a href = "###" class = "ax-btn ax-primary" id = "remove" >删除选项</ a > |
11 | < a href = "###" class = "ax-btn ax-primary" id = "disable" >禁用选项</ a > |
12 | < a href = "###" class = "ax-btn ax-primary" id = "enable" >启用选项</ a > |
13 | < a href = "###" class = "ax-btn ax-primary" id = "selected" >增加selected值</ a > |
14 | < a href = "###" class = "ax-btn ax-primary" id = "unselected" >删除selected值</ a > |
15 | < a href = "###" class = "ax-btn ax-primary" id = "clear" >清除selected值</ a > |
16 | < a href = "###" class = "ax-btn ax-primary" id = "readonly" >设置只读</ a > |
17 | < a href = "###" class = "ax-btn ax-primary" id = "readable" >设置可读</ a > |
18 | < a href = "###" class = "ax-btn ax-primary" id = "view" >查看数据</ a > |
-
01 | let methodIns = new axSelect( '#methodIns' ), |
02 | add = document.querySelector( '#add' ), |
03 | remove = document.querySelector( '#remove' ), |
04 | selected = document.querySelector( '#selected' ), |
05 | unselected = document.querySelector( '#unselected' ), |
06 | disable = document.querySelector( '#disable' ), |
07 | enable = document.querySelector( '#enable' ), |
08 | clear = document.querySelector( '#clear' ), |
09 | readonly= document.querySelector( '#readonly' ), |
10 | readable = document.querySelector( '#readable' ), |
11 | view = document.querySelector( '#view' ); |
13 | add.onclick = function () { |
14 | methodIns.add( '深圳,广州,大连,呼和浩特' , 'end' , (items) => { |
15 | console.log( '新增项' , items); |
18 | remove.onclick = function () { |
19 | methodIns.remove( '广州,大连' , (items) => { |
20 | console.log( '删除项' , items); |
23 | selected.onclick = function () { |
24 | methodIns.select( '北京,上海,深圳' , (items) => { |
25 | console.log( '新selected项' , items); |
28 | unselected.onclick = function () { |
29 | methodIns.unselect( '北京' , (items) => { |
30 | console.log( '取消selected项' , items); |
33 | disable.onclick = function () { |
34 | methodIns.disable( '上海,深圳' , (items) => { |
35 | console.log( '新增禁用项' , items); |
38 | enable.onclick = function () { |
39 | methodIns.enable( '上海,深圳' , (items) => { |
40 | console.log( '新启用项' , items); |
43 | clear.onclick = function () { |
46 | readonly.onclick = function () { |
49 | readable.onclick = function () { |
52 | view.onclick = function () { |
53 | console.log( '当前文本值' , methodIns.value); |
54 | console.log( '当前selected项' , methodIns.selected); |
55 | console.log( '当前数据' , methodIns.data) |
当使用select方法时,如果将要select的选项并不存在列表当中,插件是默认不允许添加的,但是可通过设置参数absentAddable:true
,即使不存在也可作为新值添加到input当中。
-
1 | < select id = "absentIns" multiple> |
7 | < div class = "ax-break" ></ div > |
8 | < a href = "###" class = "ax-btn ax-primary" id = "absentSelected" >增加selected值</ a > |
9 | < a href = "###" class = "ax-btn ax-primary" id = "absentRemove" >删除项</ a > |
-
01 | let absentIns = new axSelect( '#absentIns' , { absentAddable: true ,clearShow: true }), |
02 | absentRemove = document.querySelector( '#absentRemove' ), |
03 | absentSelected = document.querySelector( '#absentSelected' ); |
04 | absentRemove.onclick = function () { |
05 | absentIns.remove( '广州,大连,上海,深圳' , (items) => { |
06 | console.log( '删除项' , items); |
09 | absentSelected.onclick = function () { |
10 | absentIns.select( '北京,上海,深圳' , (items) => { |
11 | console.log( '新selected项' , items); |
本插件有若干监听方法,以on为关键字,参数中监听格式为:new instance({onShow:function(){}})
;实例后监听格式是:instance.on('show',function(){})
。在参数中监听和实例后监听效果相同。具体事件说明如下:
onInit/init
初始化后执行,无参数
onBeforeAdd
添加前执行,回调需通过arrAdd()方法手动添加,支持一个参数即将要添加的项
onAdd/add
新增列表项后执行,支持一个参数即要添加的项
onBeforeRemove
移除前执行,回调需通过arrRemove()方法手动添加,,支持一个参数即将要移除的项
onRemove/remove
移除列表项后执行,支持一个参数即要移除的项
onSelect/select
使用selected后执行,支持一个参数要selected的项
onUnselect/unselect
取消selected后执行,支持一个参数要取消selected的项
onDisabled/disabled
禁用后执行,支持一个参数要禁用的项
onEnabled/onEnable
取消禁用后执行,支持一个参数要启用的项
onClear/clear
清除所有selected值后执行,无参数
onAbsentSelect/absentSelect
使用select方法时,列表不存在依然添加select值后执行,支持一个参数即当前selected项
onToggleSelect/toggleSelect
点击下拉菜单选项时执行,支持一个参数即当前的点击对象
onMost/most
selected项超出most值后执行,支持一个参数即options.most值
onLeast/least
selected小于least值后执行,支持一个参数即options.least值
onUpdate/update
参数更新后执行,无参数
onDestroy/destroy
销毁后执行,无参数
onSave/save
保存数据后执行,支持一个对象即保存的数据
另外下拉菜单使用的是axPopup插件,可使用this.popupIns.on(event,()=>{})方式进行打开和关闭监听;选择器使用的是axTag插件,可使用this.tagsIns.on(event,()=>{})方式进行selected值添加和删除监听。
演示实例显示结果使用了console.log方法,请按下F12按键打开开发者工具中的“控制台”查看监听效果。
-
01 | < select id = "onIns" multiple> |
07 | < div class = "ax-break" ></ div > |
09 | < a href = "###" class = "ax-btn ax-primary" id = "onadd" >添加选项</ a > |
10 | < a href = "###" class = "ax-btn ax-primary" id = "onremove" >删除选项</ a > |
11 | < a href = "###" class = "ax-btn ax-primary" id = "ondisable" >禁用选项</ a > |
12 | < a href = "###" class = "ax-btn ax-primary" id = "onenable" >启用选项</ a > |
-
01 | let onIns = new axSelect( '#onIns' ,{ |
07 | onadd = document.querySelector( '#onadd' ), |
08 | onremove = document.querySelector( '#onremove' ), |
09 | ondisable = document.querySelector( '#ondisable' ), |
10 | onenable = document.querySelector( '#onenable' ); |
12 | onadd.onclick = function () { |
13 | onIns.add( '深圳,广州,大连,呼和浩特' , 'end' ); |
15 | onremove.onclick = function () { |
16 | onIns.remove( '广州,大连' ); |
18 | ondisable.onclick = function () { |
19 | onIns.disable( '上海,深圳' ); |
21 | onenable.onclick = function () { |
22 | onIns.enable( '上海,深圳' ); |
24 | onIns.on( 'add' ,(items)=>{ |
25 | console.log( '新增项' , items); |
26 | }).on( 'remove' ,(items)=>{ |
27 | console.log( '删除项' , items); |
28 | }).on( 'disabled' ,(items)=>{ |
29 | console.log( '新增禁用项' , items); |
30 | }).on( 'enabled' ,(items)=>{ |
31 | console.log( '新启用项' , items); |
32 | }).on( 'toggleSelect' ,(item)=>{ |
33 | console.log( '状态变更项' , item); |
35 | console.log( 'selected项数量超过了' , n); |
37 | console.log( 'selected项数量少于' , n); |
38 | }).on( 'absentSelect' ,(items)=>{ |
39 | console.log( '新增列表没有的项' , items); |
41 | console.log( '清理了所有的selected' ); |
43 | onIns.tagsIns.on( 'add' ,(items)=>{ |
44 | console.log( '新增Tags' , items); |
45 | }).on( 'remove' ,(items)=>{ |
46 | console.log( '删除Tags' , items); |
通过使用update
方法更新插件参数。该方法有两个参数:
- setting:将要更新的参数,格式:{trigger:'hover'}
- callback:回调函数,可不填
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" value = "北京,上海,重庆" id = "updateIns" /> |
09 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "updateBtn" >更新参数</ a > |
-
01 | let updateIns = new axSelect( '#updateIns' ), |
02 | updateBtn = document.querySelector( '#updateBtn' ); |
03 | updateBtn.onclick = () => { |
05 | content: '广州,上海,苏州,惠州,河源,桂林,株洲,哈尔滨' , |
因为主动或被动关闭了浏览器导致对实例的操作未结束,使用保存数据功能可在重新打开浏览器之后恢复关闭之前的状态,此状态包括active状态、disabled状态、内容增减状态以及其他参数状态(视插件而定)。
保存数据功能是基于this.save
方法实现的,如果需要使用自动保存功能则需要填写storageName
参数并确保该参数在当页localstorage存储中是唯一的。
使用axLocalStorage.get
方法来查看保存的数据,关于axLocalStorage用法可点击这里。
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < input type = "text" value = "北京,上海,重庆,中山,西安" id = "saveIns" /> |
09 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "saveAdd" >添加新项</ a > |
10 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "saveUpdate" >更新参数</ a > |
11 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "saveView" >查看数据</ a > |
-
01 | let saveIns = new axSelect( '#saveIns' , { storageName: 'myselect01' }), |
02 | saveAdd = document.querySelector( '#saveAdd' ), |
03 | saveUpdate = document.querySelector( '#saveUpdate' ), |
04 | saveView = document.querySelector( '#saveView' ); |
05 | saveAdd.onclick = () => { |
06 | saveIns.add( '深圳,广州,大连,呼和浩特' , 'end' ); |
08 | saveView.onclick = () => { |
09 | console.log( '查看数据' ,saveIns.data); |
11 | saveUpdate.onclick = () => { |
通过使用this.destroy(callback)
方法销毁实例,支持回调函数,回调无参数;销毁后可通过init
初始化重新启用。
-
01 | < div class = "ax-form-group" > |
02 | < div class = "ax-flex-row" > |
03 | < div class = "ax-form-label" >选择城市:</ div > |
04 | < div class = "ax-form-con" > |
05 | < div class = "ax-form-input" > |
06 | < select id = "destroyIns" > |
13 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "destroyBtn" >销毁</ a > |
14 | < a href = "###" class = "ax-form-btn ax-btn ax-primary" id = "initBtn" >重置</ a > |
-
01 | let destroyIns = new axSelect( '#destroyIns' ), |
02 | destroyBtn = document.querySelector( '#destroyBtn' ), |
03 | initBtn = document.querySelector( '#initBtn' ); |
04 | destroyBtn.onclick = () => { |
06 | console.log( '销毁了实例,已经不能操作了!' ); |
08 | initBtn.onclick = () => { |
10 | console.log( '恢复了实例,又能操作了!' ); |
01 | document.addEventListener( "DOMContentLoaded" , function () { |
02 | var demo1 = new axSelect({ |
28 | inputPlaceholder: '请至少选择一项...' , |
29 | searchPlaceholder: '输入关键字...' , |
30 | editPlaceholder: '输入关键字...' , |
31 | absent: `列表中没有 "<# this.value #>" 可供选择!`, |
32 | absentAddable: `列表中没有 "<# this.value #>" ,但是作为新项加入了列表!`, |
33 | empty: '没有找到符合"<# this.value #>"的选项!' , |
34 | emptyAddable: '没有找到符合"<# this.value #>"的选项,请使用回车键添加!' , |
35 | most: `只能最多选择 "<# this.value #>" 项!`, |
36 | addFail: `添加失败!列表中已经有了 "<# this.value #>" 这一项。`, |
以axMenu插件为例,如果在元素上通过ax*使用属性,需要使用类似json的写法,属性不需要使用引号,如果值是字符串需要使用引号包裹,如果值是数字、布尔值、null或undefined不需要引号;比如要设置active,那么在元素的ax*属性中应该这样书写:axMenu="active:2"