selectize.js 单选下拉框控件的属性和方法

Selectize是一个可扩展的基于jQuery 的自定义下拉框的UI控件。它对展示标签、联系人列表、国家选择器等比较有用。它的大小在~ 7kb(gzip压缩)左右。提供一个可靠且体验良好的干净和强大的API。

文档:https://github.com/selectize/selectize.js
用例:https://github.com/selectize/selectize.js/tree/master/examples
属性/方法:https://github.com/selectize/selectize.js/blob/master/docs/usage.md

一、配置

  1. selectize属性会添加到原始的<select> / <input>元素上-该属性指向基础Selectize实例。

    配置选项描述类型默认值
    options下拉框中显示的选项array[ ]
    itmes默认选中的选项array[ ]
    delimiter默认选中的选项string‘,’
    maxItems多选的时候设置最大选择数量,不设置则为多个选择number
    valueField按照元素的属性值进行取值 ,默认用取id的值string
    labelField按照元素的属性值在下拉框中显示,如果属性值相同只显示一个string
    searchField筛选选项时要分析的属性名称数组。
    createtrue下拉option中没有输入的内容会出现Add+输入的内容,false则只能在已有的option中选择,不允许添加。boolean
    persisttrue对于使用create方式添加的option会添加到select标签下面进行保留。false,create方式添加的option只是显示在选框中,不会进行保留。boolean
    createOnBlurtrue光标移除的时候自动创建输入的内容为选项,false不会创建。boolean
    sortField排序,其中field:'text’按文本进行排序,direction:‘asc’表示升序排序,'desc’表示降序排序object
    dropdownParent取值’body’,下拉选依据body生成。有时候设置了样式,其他的元素浮动在select标签上方,可能导致下拉框下沉显示不出来,设置该属性则不会存在这个问题。String
    allowEmptyOption是否允许选择空选项,默认为falseboolean
    onChange下拉选项改变时触发方法,参数为valuefn
    onDelete删除选中项时触发方法,参数为values,方法返回true,则删除fn
    createFilter新建数据时对数据进行过滤fn
    render有两个属性①option属性,在渲染下拉列表时调用
    ②item在选中下来列表时调用
    ③optgroup_header 分组时调用改方法进行渲染
    object
    load当应该从服务器加载新选项时调用。使用当前查询字符串和回调函数调用,以在加载结果时调用结果(或在出现错误时不调用结果)。fn
    onInitializeselectize初始化完成后触发函数fn
    onItemAdd/onItemRemove添加/移除 item时触发函数fn
    onOptionAdd/onOptionRemove添加/移除option时触发函数fn
    onDropdownOpen/onDropdownClose展开/关闭下拉框时触发函数fn
    onFocus /onBlur获取/失去焦点时触发函数fn
    optgroups将选项进行分组
    optgroupField按什么属性进行分组string
    $('#select-words-regex').selectize({
    	create: true,
    	sortField: 'text', //按文本进行排序
    	createFilter: '^a+$' //在添加新选项时,过滤掉不是全a的数据,当然也可以使用函数
    });
    

二、属性

属性名称描述
options包含整个选项池的对象。该对象由每个对象的值作为键。
items所选值的数组。
//查看所有选中项的值
$('#money')[0].selectize.items
//查看所有选项
$('#money')[0].selectize.options 

三、方法

(一) Options

方法名称描述
addOption(data)添加一个可用选项或选项数组。如果已经存在,将不会发生任何事情。注意:这不会刷新选项列表下拉列表(为此使用refreshOptions())。
updateOption(value, data)更新一个可供选择的选项。如果在所选项目或选项下拉列表中可见,它将自动重新渲染。
removeOption(value)删除由给定值标识的选项。
clearOptions(silent)从控件中删除所有选项。并重置/清除所有选定项。 如果silent为真,则不会在原始 input 上触发更改事件
getOption(value)检索由给定值标识的选项的jQuery元素。
getAdjacentOption(value, direction)相对于当前突出显示的选项,检索上一个或下一个选项的jQuery元素。direction对于“下一个” ,参数应为1;对于“上一个” ,参数应为-1。
refreshOptions(triggerDropdown)刷新自动完成下拉菜单中显示的可用选项列表。triggerDropdown为true(默认)会展开可用选项,为false则不展开
//#money有selectize类时可以如下写
 $(".selectize").selectize();
$("#money")[0].selectize.clearOptions();
$("#money")[0].selectize.addItem("");
$("#money")[0].selectize.addOption({value: 123, text: '金额'});

(二) Items

方法名称描述
clear(silent)重置/清除控件中所有选定的项目。如果silent为真,则不会在原始输入上触发任何更改事件。
getItem(value)返回与给定值匹配项目的jQuery元素。
addItem(value, silent)“选择”一个项目。将其添加当前选中的列表中。如果silent为真,则不会在原始输入上触发任何更改事件。
removeItem(value, silent)移除与提供的值匹配的选定项。 如果silent为真,则不会在原始输入上触发更改事件。
createItem(value, [triggerDropdown], [callback])设置新的选中项。该方法将会调用Selectize设置中提供的create方法。
refreshItems()重新渲染选定的项目列表。
$(".selectize").selectize();
 $("#stuMajor")[0].selectize.clear();

(三) Optgroups

方法描述
addOptionGroup(id, data)注册一个新的optgroup以便将选项存储到其中。该id参数指的是optgroupField设置所标识的选项中属性的值。
removeOptionGroup(id)删除单个选项组。
clearOptionGroups()删除所有现有的选项组。

(四) Events

方法描述
on(event, handler)添加一个事件监听器。
off(event, handler)删除事件监听器。
off(event)删除所有事件侦听器。
trigger(event, …)触发事件监听器。
//添加一个 展开下拉框时的事件
$('#department')[0].selectize.on('dropdown_open', function () {
	//...
});

(五) Dropdown

方法描述
open()显示包含可用选项的自动完成下拉列表。
close()关闭自动完成下拉菜单。
positionDropdown()计算并应用下拉菜单的适当位置。

(六) Other

方法描述
destroy()销毁控件并取消绑定事件侦听器,以便可以对其进行垃圾回收。
load(fn)通过调用提供的功能来加载选项。该函数应接受一个参数(回调),并在结果可用时调用回调。
focus()使控件成为焦点。
blur()强制控件失去焦点。
lock()禁用控件上的用户输入(请注意:控件仍可以接收焦点)。
unlock()重新启用控件上的用户输入。
disable()完全禁用控件上的用户输入。禁用时,它无法获得焦点。控件中的数据也无法跟随表单传递。
enable()启用控件,使其可以响应焦点和用户输入。
getValue()返回控件的值。如果可以使用“选择”输入标签选择多个项目(例如<select multiple>),则返回一个数组。否则,返回一个字符串(delimiter如果为“ multiple” ,则用分隔符分隔)。
setValue(value, silent)将所选项目重置为给定值。
setCaret(index)将插入符号移动到指定位置(index即所选项目列表中的索引)。
isFull()返回用户是否可以选择更多项目。
clearCache(template)清除渲染缓存。有一个可选的模板参数(例如option,item)以清除只是缓存。
updatePlaceholder()更改“ settings.placeholder”值时,将显示新的占位符。
setTextboxValue(str)设置输入字段的值。
var $selectTelephone = $("#select-telephone").selectize();
telephoneSelectize = $selectTelephone[0].selectize;
 telephoneSelectize.disable();
 telephoneSelectize.enable();
 //获取选中的值
 telephoneSelectize.getValue();
 //锁定选择控件以防止用户交互
 telephoneSelectize.lock();

(七) 搜索相关

选项描述类型
options原始搜索选项。object
query原始用户输入。string
tokens包含已解析的搜索标记的数组。令牌是包含两个属性的对象:string和regex。array
total结果总数。int
items匹配结果列表。每个结果都是一个包含两个属性的对象:score和id。array

四、用例

[1]. 部分参数解释

	//初始化selectizef
	var $select = $('#select-tools').selectize();
	//获取selectize实例
	var control = $select[0].selectize;
	//清空选择栏中所选的信息
	control.clear();
	//清空所有下拉选项
	control.clearOptions();
	//添加一个下拉选项
	control.addOption({
		id: 4,
		title: 'Something New',
		value: '120'
	});
	//选择value为'time'和‘date’的选项
	control.setValue(["time",'data']);
	//也可以
	//$('#select-tools')[0].selectize.setValue(["time",'data']);

[2]. item和option的区别

如下例子中,点击item是会进行跳转到相关页面的。
在这里插入图片描述

$('#select-links').selectize({
	theme: 'links',
	maxItems: null,
	valueField: 'id',
	searchField: 'title',
	//选项中的数据,是从options中获取的
	options: [
		{id: 1, title: 'DIY', url: 'https://diy.org'},
		{id: 2, title: 'Google', url: 'http://google.com'},
		{id: 3, title: 'Yahoo', url: 'http://yahoo.com'},
	],
	render: {
		// 渲染下拉列表选项
		option: function(data, escape) {
			return '<div class="option">' +
					'<span class="title">' + escape(data.title) + '</span>' +
					'<span class="url">' + escape(data.url) + '</span>' +
				'</div>';
		},
		//选中下拉选项时,在文本框中显示的信息
		item: function(data, escape) {
			return '<div class="item"><a href="' + escape(data.url) + '">' + escape(data.title) + '</a></div>';
		}
	},
	//添加新选项时触发
	create: function(input) {
		return {
			id: 0,
			title: input,
			url: '#'
		};
	}
});

[3]. 常用事件

var eventHandler = function(name) {
    return function() {
        console.log(name, arguments);
        $('#log').append('<div><span class="name">' + name + '</span></div>');
    };
};
var $select = $('#select-state').selectize({
	create          : true,
	onChange        : eventHandler('onChange'),  //onChange事件有时不如元素自带得change事件好用
	onItemAdd       : eventHandler('onItemAdd'), //如果是监听值的变化建议使用这个
	onItemRemove    : eventHandler('onItemRemove'),
	onOptionAdd     : eventHandler('onOptionAdd'),
	onOptionRemove  : eventHandler('onOptionRemove'),
	onDropdownOpen  : eventHandler('onDropdownOpen'),
	onDropdownClose : eventHandler('onDropdownClose'),
	onFocus         : eventHandler('onFocus'),
	onBlur          : eventHandler('onBlur'),
	onInitialize    : eventHandler('onInitialize'),
});

[4]. 从服务器获取数据

  • searchField 中的值,一般对应 load 方法中返回的 res 中的值,否则将匹配不上,导致 load 中返回数据后,下拉框不会展开
$('#select-repo').selectize({
	valueField: 'url',
	labelField: 'name',
	searchField: 'name',
	options: [],
	create: false,
	render: {
		option: function(item, escape) {
			console.log(456);
			return '<div>' +
				'<span class="title">' +
					'<span class="name"><i class="icon ' + (item.fork ? 'fork' : 'source') + '"></i>' + escape(item.name) + '</span>' +
					'<span class="by">' + escape(item.username) + '</span>' +
				'</span>' +
				'<span class="description">' + escape(item.description) + '</span>' +
				'<ul class="meta">' +
					(item.language ? '<li class="language">' + escape(item.language) + '</li>' : '') +
					'<li class="watchers"><span>' + escape(item.watchers) + '</span> watchers</li>' +
					'<li class="forks"><span>' + escape(item.forks) + '</span> forks</li>' +
				'</ul>' +
			'</div>';
		}
	},
	score: function(search) {
		var score = this.getScoreFunction(search);
		return function(item) {
			return score(item) * (1 + Math.min(item.watchers / 100, 1));
		};
	},
	load: function(query, callback) {
		if (!query.length) return callback();
		$.ajax({
			url: 'https://api.github.com/legacy/repos/search/' + encodeURIComponent(query),
			type: 'GET',
			error: function() {
				callback();
			},
			success: function(res) {
		 		callback(res.repositories.slice(0, 10));
			}
	});
	}
});

[5]. 回填数据

//index页面教师选择
var initTeacherForIndex = function ($target, options, items) {
    $target.selectize({
        items: items,
        options: options,
        valueField: 'id',
        searchField: ['code', 'nameZh'],
        create: false,
        render: {
            item: function (item, escape) {
                return '<div id="teacherAssocId">'
                    + '<span>' + escape(item.nameZh) + '(' + escape(item.code) + ')</span>'
                    + '</div>';
            },
            option: function (item, escape) {
                return '<div>'
                    + '<span>' + escape(item.nameZh) + '(' + escape(item.code) + ')</span>'
                    + '</div>';
            }
        },
        load: function (query, callback) {
            if (!query.length) return callback();
            $.ajax({
                url:'如果需要进行搜索时的搜索地址',
                type: 'get',
                data: {
                    zaiZhi: true,
                    term: query
                },
                error: function () {
                    callback();
                },
                success: function (res) {
                    var result = [];
                    $.each(res, function (index, item) {
                        result.push({id: item.id, code: item.code, nameZh: item.person.nameZh});
                    });
                    callback(result);
                }
            });
        }
    });
}


var manageTeacherAssoc = function () {
    var search = location.search.substring(1);
    var searchObj = search ? JSON.parse('{"' + search.replace(/&/g, '","').replace(/=/g, '":"') + '"}',
        function (key, value) {
            return key === "" ? value : decodeURIComponent(value)
        }) : {};
    if (searchObj.teacherAssoc) {
        $.ajax({
            url: '需要回填的信息的请求地址',
            async:false,
            data: {
                teacherAssoc: searchObj.teacherAssoc,
            },
            success: function (result) {
               var teacherAssocOption = {};
               var teacherAssocOptions = [];
               var items = [];
                teacherAssocOption['id'] = result.id;
                teacherAssocOption['code'] = result.code;
                teacherAssocOption['nameZh'] = result.person ? result.person.nameZh : '';
                teacherAssocOptions.push(teacherAssocOption);
                items.push(result.id);
                initTeacherForIndex($('#teacherAssoc'), teacherAssocOptions, items);
            }
        });
    } else {
        initTeacherForIndex($('#teacherAssoc'), [], [])
    }
}



manageTeacherAssoc();

[6]. 追加数据

var res = {};//新数据
//追加下拉选项
$('#student')[0].selectize.addOption({
                id: res.id,
                nameZh: res.person.nameZh,
                code: res.code,
                personId: res.person.id
              });
//添加追加的选中的选项
$('#student')[0].selectize.addItem(res.id);

[7]. 添加和销毁selectize

//html:<tr><select class="selectize">...</select>

//销毁selectize
function destroySelectize($thisTr) {
  var valArr = []; //存储下拉框中的值
  $thisTr.find('select.selectize').each(function () {
    selectizeValArr.push($(this).val() ? $(this).val() : null)
    $(this)[0].selectize.destroy();
  });
  return valArr ;
}

//添加selectize
function initSelectize($thisTr, valArr) {
  $thisTr.find('.selectize').each(function (i) {
    $(this).selectize();
    if (selectizeValArr && selectizeValArr.length) {
      this.selectize.setValue(selectizeValArr[i]);
    }
  });
}

[8]. 超出父元素时,点击下拉框父元素滚动到左边的问题

问题形成原因是因为,插件自动给input框一个样式style="width: 4px; left: -10000px; opacity: 0; position: absolute;"导致滚动条滚动。
可以如下解决:

//鼠标放到元素上时就将left进行归0
 $('.right-table td').mouseover(function(){
  if($(this).find('input').length){
     $(this).find('input').css('left', 0)
   }
 });

[9]. 禁用某个选项

<select name="" id="selectize">
  <option value="">...</option>
  <!-- 该项被禁用 -->
   <option value="1" disabled>值1</option> 
   <option value="2">值2</option>
</select>

[10].添加一个监听函数

//插件的change事件
 $("#educationAssoc")[0].selectize.on('change', function(val){
  clearAdminClassAssoc(val);
 });
 
$('#educationAssoc')[0].selectize.on('item_add', function(val){
   console.log(val)
})

五、插件

[1] 删除按钮

$('.input-tags').selectize({
	plugins: ['remove_button'],
	persist: false,
	create: true,
	render: {
		item: function(data, escape) {
			return '<div>"' + escape(data.text) + '"</div>';
		}
	},
	onDelete: function(values) {
		return confirm(values.length > 1 ? 'Are you sure you want to remove these ' + values.length + ' items?' : 'Are you sure you want to remove "' + values[0] + '"?');
	}
});

[2] 拖动

需要使用jquery ui

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./css/stylesheet.css">
    <link rel="stylesheet" href="./css/normalize.css">
    <link rel="stylesheet" href="./css/selectize.default.css">
    <link rel="stylesheet" href="./css/jquery-ui.css">
</head>

<body>
    <div class="control-group">
        <label for="input-sortable">Tags:</label>
        <input type="text" id="input-sortable" class="input-sortable demo-default" value="drag,these,items,around">
    </div>
    <script src="./js/jquery.min.js"></script>
    <script src="./js/selectize.js"></script>
    <script src="./js/jquery-ui.js"></script>
    <script>
        $('.input-sortable').selectize({
            plugins: ['drag_drop'],
            persist: false,
            create: true
        });
    </script>
</body>

</html>
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值