标签: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. redis深入学习(二)-----redis配置文件、持久化

    redis配置文件 地址 units单位 a  配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bitb  对大小写不敏感 GENERAL通用 1.daemonize 2.pidf ...

  2. LintCode_1 单例模式

    从今天开始我的LintCode之旅,由于C/C++好久没有使用了,语法生疏不说,低级错误频繁出现,因此在做题之后,还会有部分时间复习语法项目. ---------------------------- ...

  3. 6月份Github上最热门的Java开源项目!

    1.halo 这是一个轻快,简洁,功能强大,使用Java开发的博客系统. 项目地址:https://github.com/halo-dev/halo   Star 6139 2.jeecg-boot ...

  4. 恭喜"微微软"喜当爹,Github嫁入豪门。

    今天是 Github 嫁入豪门的第 2 天,炒得沸沸扬扬的微软 Github 收购事件于昨天(06月04日)尘埃落定,微软最终以 75 亿美元正式收购 Github. 随后,Gitlab 趁势带了一波 ...

  5. python学习笔记3.3_json解析

    一.json文件读取 源文件:exampl.json 二.json在线解析 常用网站:https://www.json.cn/  三.数据导出为json格式文件

  6. vue 使用QRcode生成二维码或在线生成二维码

    参考:https://blog.csdn.net/zhuswy/article/details/80267748 1.安装qrcode.js npm install qrcodejs2 --save ...

  7. NCDC 天气数据的预处理

    "Hadoop: The Definitive Guild" 这本书的例子都是使用NCDC 天气数据的,但由于书的出版和现在已经有一段时间了,NCDC现在提供的原始数据结构已经有了 ...

  8. 高德地图(AMap)JavaScript API的使用

    申请JSAPI的开发者key 申请地址:http://lbs.amap.com/dev/key 引入高德地图JavaScript API文件: <script type="text/j ...

  9. grpc之protobuf常用语法速学

    1,语法速学(1):返回商品”数组”.repeated修饰符 Repeated:是一个修饰符,返回字段可以重复任意多次(包括0次) 可以认为就是一个数组(切片) 服务端: 创建protobuf文件 s ...

  10. 【JAVA】Class.getResource()与ClassLoader.getResource()的区别

    转载自:https://blog.csdn.net/qq_33591903/article/details/91444342 Class.getResource()与ClassLoader.getRe ...