标签: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. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...

  2. Java - 关于覆盖和重写的总结

    公众号偶然看到的一个帖子,构造方法,类方法,final方法,哪些能覆盖,哪些能重载,初学时也是被这些术语搞的很迷糊 现在有时间了对这些做一个总结.全是自己的语言,可能不是很全面,表达意思应该够清楚 一 ...

  3. 轻量级IoC框架Ninject.NET搭建

    说在之前的话 IOC的概念相信大家比较熟悉了,习惯性称之为依赖注入或控制反转,园子里对基于MVC平台IOC设计模式已经相当多了,但大家都只知道应该怎么应用一个IOC模式,比如Ninject, Unit ...

  4. 不同版本springboot上传文件大小设置

    参考原文:https://blog.csdn.net/awmw74520/article/details/70230591 Spring Boot 1.3.x或者之前 multipart.maxFil ...

  5. JZOJ100045 【NOIP2017提高A组模拟7.13】好数

    题目 题目大意 首先有一个定义: 对于一个数,如果和它互质的数可以组成一个等差数列,那么这个数叫"好数". 现在给你一个数列,有三种操作: 1.询问一段区间内的好数的个数. 2.将 ...

  6. Django项目:CRM(客户关系管理系统)--64--54PerfectCRM实现CRM客户报名链接

    # kingadmin.py # ————————04PerfectCRM实现King_admin注册功能———————— from crm import models #print("ki ...

  7. k8s 各个概念解释

    pods ,  k8s 的核心, 所有的的操作都是围绕 pod , pod 可以认为是多个容器的捆绑.pod 里的容器里共享 cpu 网络  存储.                          ...

  8. MATLAB---fopen、fprintf函数

    1 概述 fopen()是个将数据按指定格式读入到matlab中的函数. fprintf()是个将数据按指定格式写入到文本文件中的函数. 2 用法 2.1 fopen函数 matlab中fopen函数 ...

  9. grep与find命令的区别

    grep与find命令的区别:grep搜索的是文本,find搜索的是文件,换句话说就是grep是查找匹配条件的行,find是搜索匹配条件的文件. grep文本搜索/过滤 用法:grep[参数]搜索字符 ...

  10. 2019-2-19-win10-uwp-客户端如何发送类到-asp-dotnet-core-作为参数

    title author date CreateTime categories win10 uwp 客户端如何发送类到 asp dotnet core 作为参数 lindexi 2019-2-19 9 ...