标签:color   dom   layui   href   默认事件   替换   each   ase   options

  最近项目中使用到了select2来美化和丰富下拉框的功能,这款插件功能丰富,使用简单,可以对已经生成的select标签进行改造,也可以对json数据直接生成下拉列表,包括一些检索功能,异步加载功能等,能够很大程度的满足视觉和交互的要求。是开发过程中不可多得的一款利器。

官方文档是英文文档且是以问答形式展示他的可配置项的,可能作者会觉得这样做比较有趣,但是对于渣渣英语的我来说,肯定是一种煎熬, 现在和大家分享一下在开发过程中的一些问题:

一、使用篇

1.根据官方文档的提示配置了placeholder却不起作用;

  1.1  你需要在select标签中放置一个空的option标签,用来做placeholder文字的存储容器;

  1.2  你要在select标签上添加一个属性“data-placeholder=‘ 你要提示的placeholder  ‘”

  1.3  最后才是在select2 的配置项中加入配置项"placeholder: ‘请选择‘,"

  而文档中却没有提到这些东西,小小的一个功能藏这么多猫腻,真是心塞;

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="bower_components/select2/dist/css/select2.css">
</head>
<body>
<select data-tags="true" data-placeholder="请选择" >
<option></option>
<option value="1">1111</option>
<option value="2">2222</option>
<option value="3">3333</option>
<option value="4">4444</option>
</select> </body>
<script src="bower_components/jquery/dist/jquery.min.js"></script>
<script src="bower_components/select2/dist/js/select2.min.js"></script>
<script>
$("select").select2({
placeholder: "请选择",
allowClear: 0,
minimumResultsForSearch: Infinity,
width:200
});
</script>
</html>

2. 取消下拉框的检索功能;

  配置项为 { minimumResultsForSearch: Infinity, }

二、改造篇

一.下拉框选择过程中弹框确认

  该类事件可以理解为在select2对象在操作的各个阶段的钩子函数,当然官方为我们配置相应的接口,允许我们在打开,关闭,选前,选中,选后等时间阶段来处理我们配置的回调函数;

  这类事件(点击查看)可以通过在on绑定在select2实例上,一般性的功能可以在回调函数中处理;

            $("select").select2({
placeholder: ‘请选择‘
}).on("select2:selecting",function(e){
alert(" 我选中了 ")
});

  现在有一个棘手的问题,我需要在选中的一瞬间进行弹框提示,然后不允许select2的其他事件继续向执行,然后经过弹框确认后再继续向下执行,此时弹框不能做出任何改变;

  首先在点击模态框的过程中,不能让select下拉框关闭:

  我们需要进行2步骤操作:

  1.1 在弹框出来后,除了点击“确认”和“取消”按钮,点击其他地方不能关闭下拉框;

  select2会在其构造函数BaseSelection的原型上定义关闭方法,关闭方法中使用自定义的事件关联到对应id的盒子上,我们可以在这个方法中来阻断关闭操作;

  BaseSelection.prototype._attachCloseHandler = function (container) {
var self = this;
$(document.body).on(‘mousedown.select2.‘ + container.id, function (e) {
var $target = $(e.target); var $select = $target.closest(‘.select2‘); var $all = $(‘.select2.select2-container--open‘); $all.each(function () {
var $this = $(this);
if (this == $select[0]) {
return;
}
var $element = $this.data(‘element‘);
//在模态框存在的条件下,禁止使用select2的关闭功能(这里可以根据你使用的类来灵活操作)
var mask = $(".layui-layer-shade");
if(mask.length == 0){
$element.select2(‘close‘);
}
});
});
};

  

  1.2 在选择select2框下的内容时,不能立即执行回调函数,回调函数必须放在“确认”按钮点击后处理;

通常在最初程序设计的时候,正确的做法应该是把后续函数设计在layer的确认回调函数中,我本来不打算使用select2插件,但是产品的世界你懂得,变化是随时随地发生的。

    最初的函数是通过监控select标签的change状态来链式触发的,这一点很重要,如果想把目标回调函数放到select2的钩子函数中,会直接执行,不符合我们弹框进行确认取消的目的;

    如何实现本地的这种异步操作?其实我们需要使用一个中间函数,让这个函数去触发select标签的change事件。

 var selectWebNamer = $(".selectWebName").select2({
myMsg:‘无可配置网站‘, //此处不是select的配置项后面解说
placeholder: ‘请选择‘
}).on("select2:selecting",function(e){
if(data.siteList.length==0){
return false;
}
if(!that.status.canChange){
that._confirmChange(e, that._queryParam,this);
}
});

      第一件事情:阻止默认事件  event.preventDefault();  我们的异步函数我们自己来控制,select2取消你自作主张的行为;

       此时绑定在select2:selecting 事件上的函数会去调起弹框窗口;

    that._queryParam 是中间函数,这个函数会在确认按钮后执行;下一步会触发真正的select标签change事件;

    而event事件是select2包装后的事件,这个包装好的事件可以让我们跟踪到真正需要点击的select 标签;所以在 that._queryParam 中需要带入这个event对象;

    在确认或取消点击的一瞬间select2的下拉框要关闭,所以此时通过指正传入这个select2对象也是有必要的;

  _confirmChange:function(event,callback,$this){
var that = this;
event.preventDefault();
$(".layui-layer-shade").remove();
layer.closeAll();
layer.open({
type: 1,
title: ‘返回‘,
area: [‘500px‘, ‘270px‘],
btn: [ ‘确认‘,‘取消‘],
closeBtn: 2,
content: $(‘#changeMsg‘),
btn1: function (index) {
layer.closeAll();
if(callback){
callback(event);
$($this).select2(‘close‘);
that.status.canChange = true;
}
},
btn2: function (index) {
layer.close(index);
$($this).select2(‘close‘);
}
});
//}
},

    event对象中包含了我们现在操作的dom对象,和当前选中的option上的值;

     jquery 如何选中 select中某个option?,用的不多,可能大家都忘记了吧。

    此时,我们的change事件被触发了,就和我们手动点击了option 一样,后续的代码可以顺利执行了。

  _queryParam:function(event){
if(!event){
return false;
}
var target = event.currentTarget;
var name = event.params.args.data.text;
$(target).val(name).trigger("change");
},

二、如何修改select2的提示信息

    采用select2实例化后如果后台没有给我们返回数据的话,select2会友好的在下拉框处提示“No Result Is Fonud”(貌似是这样)

    然后,可爱的交互妹妹说,不行,我不要看英文,我不认识。。。。。 好吧,你赢。

    检查了一下,好像没有这个提示信息配置api,于是我就邪恶的找到引入文件中的select2.min.js    ctrl+R(“No Result Is Fonud” --------" 别瞎拉了,后台没返回")

    ok  懒得改,就这样。

    过了一会儿交互妹妹不干了,怎么都是“别瞎拉了,后台没返回”,我要的是“呵呵,我不想给你返回 ”,“ 返回过程中被恐龙吃掉了 ”,“你太丑了,不给你看”。。。。。。。

    好吧好吧,我给你配置成你想说啥说啥还不行吗。

    看了一下文档,作者一看就是高手提供了10来种语言的提示信息,原来人家本来就有中文版的“别瞎拉了,你后台没返回”,还有英文版的“don`t  blind pull la , then didn‘t give us ”,还有日文版的“ 雅蠛蝶雅蠛蝶” ,可恨的是zh-CH.js和zh-TW.js  是分别简体和繁体的,丫的,搞事情。

    如果没有要求提示不一样的内容,直接在配置项中设置language就可以使用对应的语言;

    如果想要提示不应的内容,需要手动改造一下,让它去替换。

    我们找到与结果相关的Result模块,并找到其原型上的append方法;

    我们在option上使用的字段是myMsg ,来配置本下拉框的无内容提示,

    原来的提示条件最好给他保留 如果我没有配置myMsg字段那你就按照你原来的处理,如果我有配置myMsg字段,你就要按照我的来。

      if( data.results == null || data.results.length === 0)&& !myMsg)  {   你原来怎么处理就怎么处理  }

         else if((data.results == null || data.results.length === 0)&& !!myMsg){   在result:message 时间的参数中加入我们的信息  }

  Results.prototype.append = function (data) {
this.hideLoading();
var myMsg = this.options.options.myMsg; //获取提示文字
var $options = [];
if ((data.results == null || data.results.length === 0)&& !myMsg) { //按你的来
if (this.$results.children().length === 0) {
this.trigger(‘results:message‘, {
message: ‘noResults‘
});
}
return;
}else if((data.results == null || data.results.length === 0)&& !!myMsg){ //按我的来
if (this.$results.children().length === 0) {
this.trigger(‘results:message‘, {
message: ‘noResults‘,
myMessage:myMsg
});
}
return;
} data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) {
var item = data.results[d]; var $option = this.option(item); $options.push($option);
} this.$results.append($options);
};

  然后顺藤摸瓜,从results:message事件上摸到展示displayMessage方法上,然后我们判断一下 “myMessage” 带过来了没有,如果带过来了,那就用我们的提示

  Results.prototype.displayMessage = function (params) {
var escapeMarkup = this.options.get(‘escapeMarkup‘);
this.clear();
this.hideLoading();
var $message = $(
‘<li role="treeitem" aria-live="assertive"‘ +
‘ class="select2-results__option"></li>‘
); var message = this.options.get(‘translations‘).get(params.message);
$message.append(
escapeMarkup(
params.myMessage? params.myMessage:message(params.args) //决定用我们的提示还是它自己的提示。
)
); $message[0].className += ‘ select2-results__message‘; this.$results.append($message);
};

  ok 至此,交互妹子的需求都实现了,select2的本次改造也结束了。

select2 如何自定义提示信息

标签:color   dom   layui   href   默认事件   替换   each   ase   options

原文:http://www.cnblogs.com/wuhaozhou/p/7449661.html

 var selectWebNamer = $(".selectWebName").select2({
myMsg:‘无可配置网站‘, //此处不是select的配置项后面解说
placeholder: ‘请选择‘
}).on("select2:selecting",function(e){
if(data.siteList.length==0){
return false;
}
if(!that.status.canChange){
that._confirmChange(e, that._queryParam,this);
}
});
  Results.prototype.append = function (data) {
this.hideLoading();
var myMsg = this.options.options.myMsg; //获取提示文字
var $options = [];
if ((data.results == null || data.results.length === 0)&& !myMsg) { //按你的来
if (this.$results.children().length === 0) {
this.trigger(‘results:message‘, {
message: ‘noResults‘
});
}
return;
}else if((data.results == null || data.results.length === 0)&& !!myMsg){ //按我的来
if (this.$results.children().length === 0) {
this.trigger(‘results:message‘, {
message: ‘noResults‘,
myMessage:myMsg
});
}
return;
} data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) {
var item = data.results[d]; var $option = this.option(item); $options.push($option);
} this.$results.append($options);
};

  然后顺藤摸瓜,从results:message事件上摸到展示displayMessage方法上,然后我们判断一下 “myMessage” 带过来了没有,如果带过来了,那就用我们的提示

  Results.prototype.displayMessage = function (params) {
var escapeMarkup = this.options.get(‘escapeMarkup‘);
this.clear();
this.hideLoading();
var $message = $(
‘<li role="treeitem" aria-live="assertive"‘ +
‘ class="select2-results__option"></li>‘
); var message = this.options.get(‘translations‘).get(params.message);
$message.append(
escapeMarkup(
params.myMessage? params.myMessage:message(params.args) //决定用我们的提示还是它自己的提示。
)
); $message[0].className += ‘ select2-results__message‘; this.$results.append($message);
};

         else if((data.results == null || data.results.length === 0)&& !!myMsg){   在result:message 时间的参数中加入我们的信息  }

      if( data.results == null || data.results.length === 0)&& !myMsg)  {   你原来怎么处理就怎么处理  }

    原来的提示条件最好给他保留 如果我没有配置myMsg字段那你就按照你原来的处理,如果我有配置myMsg字段,你就要按照我的来。

    我们在option上使用的字段是myMsg ,来配置本下拉框的无内容提示,

    我们找到与结果相关的Result模块,并找到其原型上的append方法;

    如果想要提示不应的内容,需要手动改造一下,让它去替换。

    如果没有要求提示不一样的内容,直接在配置项中设置language就可以使用对应的语言;

    看了一下文档,作者一看就是高手提供了10来种语言的提示信息,原来人家本来就有中文版的“别瞎拉了,你后台没返回”,还有英文版的“don`t  blind pull la , then didn‘t give us ”,还有日文版的“ 雅蠛蝶雅蠛蝶” ,可恨的是zh-CH.js和zh-TW.js  是分别简体和繁体的,丫的,搞事情。

二、如何修改select2的提示信息

    采用select2实例化后如果后台没有给我们返回数据的话,select2会友好的在下拉框处提示“No Result Is Fonud”(貌似是这样)

  _queryParam:function(event){
if(!event){
return false;
}
var target = event.currentTarget;
var name = event.params.args.data.text;
$(target).val(name).trigger("change");
},

    此时,我们的change事件被触发了,就和我们手动点击了option 一样,后续的代码可以顺利执行了。

     jquery 如何选中 select中某个option?,用的不多,可能大家都忘记了吧。

    event对象中包含了我们现在操作的dom对象,和当前选中的option上的值;

  _confirmChange:function(event,callback,$this){
var that = this;
event.preventDefault();
$(".layui-layer-shade").remove();
layer.closeAll();
layer.open({
type: 1,
title: ‘返回‘,
area: [‘500px‘, ‘270px‘],
btn: [ ‘确认‘,‘取消‘],
closeBtn: 2,
content: $(‘#changeMsg‘),
btn1: function (index) {
layer.closeAll();
if(callback){
callback(event);
$($this).select2(‘close‘);
that.status.canChange = true;
}
},
btn2: function (index) {
layer.close(index);
$($this).select2(‘close‘);
}
});
//}
},

    在确认或取消点击的一瞬间select2的下拉框要关闭,所以此时通过指正传入这个select2对象也是有必要的;

    而event事件是select2包装后的事件,这个包装好的事件可以让我们跟踪到真正需要点击的select 标签;所以在 that._queryParam 中需要带入这个event对象;

    that._queryParam 是中间函数,这个函数会在确认按钮后执行;下一步会触发真正的select标签change事件;

       此时绑定在select2:selecting 事件上的函数会去调起弹框窗口;

      第一件事情:阻止默认事件  event.preventDefault();  我们的异步函数我们自己来控制,select2取消你自作主张的行为;

    如何实现本地的这种异步操作?其实我们需要使用一个中间函数,让这个函数去触发select标签的change事件。

    最初的函数是通过监控select标签的change状态来链式触发的,这一点很重要,如果想把目标回调函数放到select2的钩子函数中,会直接执行,不符合我们弹框进行确认取消的目的;

通常在最初程序设计的时候,正确的做法应该是把后续函数设计在layer的确认回调函数中,我本来不打算使用select2插件,但是产品的世界你懂得,变化是随时随地发生的。

  1.2 在选择select2框下的内容时,不能立即执行回调函数,回调函数必须放在“确认”按钮点击后处理;

  BaseSelection.prototype._attachCloseHandler = function (container) {
var self = this;
$(document.body).on(‘mousedown.select2.‘ + container.id, function (e) {
var $target = $(e.target); var $select = $target.closest(‘.select2‘); var $all = $(‘.select2.select2-container--open‘); $all.each(function () {
var $this = $(this);
if (this == $select[0]) {
return;
}
var $element = $this.data(‘element‘);
//在模态框存在的条件下,禁止使用select2的关闭功能(这里可以根据你使用的类来灵活操作)
var mask = $(".layui-layer-shade");
if(mask.length == 0){
$element.select2(‘close‘);
}
});
});
};

  select2会在其构造函数BaseSelection的原型上定义关闭方法,关闭方法中使用自定义的事件关联到对应id的盒子上,我们可以在这个方法中来阻断关闭操作;

  1.1 在弹框出来后,除了点击“确认”和“取消”按钮,点击其他地方不能关闭下拉框;

  我们需要进行2步骤操作:

  首先在点击模态框的过程中,不能让select下拉框关闭:

  现在有一个棘手的问题,我需要在选中的一瞬间进行弹框提示,然后不允许select2的其他事件继续向执行,然后经过弹框确认后再继续向下执行,此时弹框不能做出任何改变;

            $("select").select2({
placeholder: ‘请选择‘
}).on("select2:selecting",function(e){
alert(" 我选中了 ")
});

  这类事件(点击查看)可以通过在on绑定在select2实例上,一般性的功能可以在回调函数中处理;

  该类事件可以理解为在select2对象在操作的各个阶段的钩子函数,当然官方为我们配置相应的接口,允许我们在打开,关闭,选前,选中,选后等时间阶段来处理我们配置的回调函数;

一.下拉框选择过程中弹框确认

select2 如何自定义提示信息-布布扣-bubuko.com的更多相关文章

  1. [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用)-布布扣-bubuko.com - Google Chrome

    [Kali_Debian] 清除无用的库文件(清理系统,洁癖专用) 时间:2014-11-07 16:25:36      阅读:1486      评论:0      收藏:0      [点我收藏 ...

  2. jquery.validate.js默认配置,jquery.validate.js自定义提示信息

    jquery.validate.js默认配置,jquery.validate.js自定义提示信息 配置jQuery.validator默认的处理方法 >>>>>>& ...

  3. Uploadify自定义提示信息

    Uploadify是一款基于Jquery的上传插件,用起来很方便.但上传过程中的提示语言为英文,这里整理下如何修改英文为中文提示.方法1:直接修改uploadify.js中的提示信息,将英文提示改成对 ...

  4. echarts tooltip 自定义提示信息添加圆点

    tooltip自定义时,给文字前加圆点 tooltip: { formatter: '{b}<br /><span style="display:inline-block; ...

  5. Qt 之 自定义提示信息框—迅雷风格(模拟QDialog类的exec()方法) good

    http://blog.csdn.net/goforwardtostep/article/details/53614830

  6. Servlet 3.0

    Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发 ...

  7. Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCompc dtS420 \s2018 s4f doc homepc \s2018 s4 doc compc dtS44\(5 封私信 _ 44 条消息)WebSocket 有没有可能取代 AJAX

    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCo ...

  8. dxf组码

    值 说明 -5 APP:永久反应器链 -4 APP:条件运算符(仅与 ssget 一起使用) -3 APP:扩展数据 (XDATA) 标记(固定) -2 APP:图元名参照(固定) -1 APP:图元 ...

  9. Atitit 分区后的查询  mysql分区记录的流程与原理

    Atitit 分区后的查询  mysql分区记录的流程与原理 1.1.1. ibd是MySQL数据文件.索引文件1 1.2. 已经又数据了,如何分区? 给已有的表加上分区 ]1 1.3. 分成4个区, ...

随机推荐

  1. git difff

    Generate patch through git diff http://stackoverflow.com/questions/1191282/how-to-see-the-changes-be ...

  2. SpringBoot学习笔记(二):SpringBoot访问静态文件、捕获全局异常、集成Thymeleaf、集成JSP

    SpringBoot访问静态文件 什么是静态文件? 不需要通过web容器去得到的文件,直接通过路径就能得到的文件,比如项目的css,js,img等文件. 所有的资源文件都应该在src/main/res ...

  3. 关于不同数据库的连接配置(MySql和Oracle)

    mysql: driverClass=com.mysql.jdbc.Driver #在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8,插入数据库防止中文乱码 ur ...

  4. Python学习day19-常用模块之re模块

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  5. Shield 安装与配置

    Shield 安装与配置   https://www.elastic.co/guide/en/shield/shield-1.3/introduction.html  一.简介 Shield是Elas ...

  6. Elasticsearch & Kibana with Shield

    Elasticsearch & Kibana with Shield   官方网站: https://www.elastic.co/guide/en/kibana/current/produc ...

  7. HBase Region的定位

  8. linux删除登录日志及历史命令

    参考:https://blog.51cto.com/study2008/2301555 基本常用清理linux日志: # echo > /var/log/wtmp //清除用户登录记录 # ec ...

  9. Mahout In Action-第一章:初识Mahout

    1. 初识Mahout 本章涵盖以下内容: Apache Mahout是什么? 现实中推荐系统引擎.聚类.分类概述 配置mahout 读者可能从本书的标题中猜测到,本书是一本讲解如何将mahout应用 ...

  10. 去掉IE提示:在此页上的ActiveX控件和本页上的其他部分的交互可能不安全。你想允许这种交互吗?

    由于项目需求,需要用到OCX控件.而在IE浏览器中加载OCX控件会有如下提示: 这是因为OCX控件有一个ID,而这个ID注册后IE不认为该OCX控件是安全的.所以,必须把这个控件注册为安全控件. 假设 ...