Chosen 的 optgroup 第一级单击的时候选择二级的全部
相关环境 及 版本
Chosen (v1.6.2) https://harvesthq.github.io/chosen/
jQuery (v1.8.3) 官网 http://jquery.com/
前几天用到了二级的多选列表,选择使用Chosen。如下图一个美化控件。
问题1来了:客户要求在第一级单击的时候,要选择二级的全部。
初步预想:chosen是没有这个功能的,用js给这个元素 加入一个click事件,然后遍历一下它的子元素应该就可以搞定了。
好了开始按着这个思路处理。但发现很多不是想预想的那样,添加上事件后没有任何反应。来看看这个控件的显示原理吧,一看才发现它把原生的select元素隐藏,然后在元素后面添加了div元素并结合一些css样式才显示成我们看到的样子。一头雾水,还是百度一下吧,其它人应该也会遇到这个问题。果不其然,被我找到了 http://robido.com/jquery/add-selectdeselect-optgroup-click-events-harvests-chosen-jquery-plugin/ 不过是英文的,凑合着看吧。
// Add select/deselect all toggle to optgroups in chosen
$(document).on('click', '.group-result', function() {
// Get unselected items in this group
var unselected = $(this).nextUntil('.group-result').not('.result-selected');
if(unselected.length) {
// Select all items in this group
unselected.trigger('mouseup');
} else {
$(this).nextUntil('.group-result').each(function() {
// Deselect all items in this group
$('a.search-choice-close[data-option-array-index="' + $(this).data('option-array-index') + '"]').trigger('click');
});
}
});
测试了一下还不错,和客户的需求吻合。
使用一段时间以后,由于业务扩展 需要在这个页面上面增加一个二级多选列表。那就再加一个select元素,还用chosen呗,结果发现了一个致命问题。
问题2来了:取消选择,也就是代码中deselect all 的时候,jquery的选择器选择的是整个document的。删除两个select元素中相同索引的子元素,造成数据丢失。
经过一思索后,改进如下。
// Add select/deselect all toggle to optgroups in chosen
$( document ).on( 'click', '.group-result', function () {
// Get unselected items in this group
var unselected = $( this ).nextUntil( '.group-result' ).not( '.result-selected' );
if ( unselected.length ) {
// Select all items in this group
unselected.trigger( 'mouseup' );
} else {
var groups = new Array();
$( this ).nextUntil( '.group-result' ).each( function () {
// Deselect all items in this group
// $( 'a.search-choice-close[data-option-array-index="' + $( this ).data( 'option-array-index' ) + '"]' ).trigger( 'click' );
groups[groups.length] = $(this).parent().parent().prev().find('a.search-choice-close[data-option-array-index="' + $( this ).data( 'option-array-index' ) + '"]');
} ); for (var i = groups.length - 1; i >= 0; i--) {
groups[i].trigger('click');
}
}
} );
注意:trigger('click')后会删除本身,所以要先循环一遍 找到所有需要移除的元素,再全部触发删除。
Chosen 的 optgroup 第一级单击的时候选择二级的全部的更多相关文章
- word多级编号,如何让第一级为大写“一”,其他级别均为小写1.
自定义里面设置了第一级为大写,2级.3级首字跟着变为大写,是因为2.3级没有勾选"正规形式编号",如图:
- STL——空间的配置和释放std::alloc(第一级配置器和第二级配置器)
1 空间的配置和释放,std::alloc 对象构造前的空间配置和对象析构后的空间释放,由<stl_alloc.h>负责,SGI对此的设计哲学如下: 向system heap要求空间 考虑 ...
- 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
/** 转换成XML格式字符串 **/ public static String doXMLStr(Map<String, String> map) { StringBuffer xml_ ...
- STL源码分析之第一级配置器
前言 上一节我们分析了空间配置器对new的配置, 而STL将空间配置器分为了两级, 第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都 ...
- Bootstrap Table踩坑——设置多级表头后只显示第一级表头问题解决办法
今天设置了Bootstrap Table的复杂表头,设置了多级表头(两行列名),但是只能显示第一级表头(第一行的列名),第二级的表头被第一级的表头覆盖.但是我仿照其他网上的其他设置复杂表头例子都能正常 ...
- Java获取Linux上指定文件夹下所有第一级子文件夹
说明:需要只获得第一级文件夹目录 package com.sunsheen.jfids.studio.monitor.utils; import java.io.BufferedReader; imp ...
- Element UI:级联选择器Cascader_动态加载_多级请求不同接口(已知第一级调取第二级)
ELEMENT UI_CASCADER 使用过饿了么级联动态加载的小伙伴应该都知道,lazyLoad本身是一个无差别返回渲染结点的函数. 当我们存在一个需求:已知级联选择器的第一级结点,现在需要通过第 ...
- easyui datagrid单击单元格选择此列
示例代码实现单击jquery easyui datagrid的单元格时,取消datagrid默认选中高亮此行的样式,改为选中单击的单元格所在的列,高亮此列上的所有单元格.可以配置全局single变量, ...
- Java基础-程序流程控制第一弹(分支结构/选择结构)
Java基础-程序流程控制第一弹(分支结构/选择结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.if语句 1>.if语句的第一种格式 if(条件表达式){ 语句体: ...
随机推荐
- IDEA 创建 Maven web项目注意事项
需要设置 Maven ->Runner->VM options -Dmaven.multiModuleProjectDirectory=$M2_HOME 需要添加一个archetypeCa ...
- maven(二),Linux安装maven3.5.3及配置
Linux系统,ubuntu-16.04.4,安装maven3.5.3 一.创建文件夹 注意Linux用户,这个如果不是root用户,命令前面需要加:sudo //创建一个目录 mkdir /usr/ ...
- Visual Studio Code如何编写运行C、C++
Visual Studio Code如何编写运行C.C++ 作者:知乎用户链接:https://www.zhihu.com/question/30315894/answer/154979413来源:知 ...
- dbvisualizer设置自动补全不显示模式名
- 一个简化的插件框架c#
利用MEF实现插件加载. 定义了一套接口,分别实现插件主界面,插件,业务插件等. 整套加载完全使用MEF2. 所有插件分开,包括主界面也是插件实现. 用一个应用程序,只有Main和插件加载方法.我管它 ...
- jackson 问题定位
问题背景: 云计算Pass平台版本升级,导致引用的jackson的包直接由1.*升级为2.* .在版本1.*中对于字段名与实际json不符的直接忽略了,而在2.*中则会报错.诸如此类,有较大差异,需要 ...
- 三、SpringBoot项目探究
1.pom文件 父项目 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...
- java 逻辑运算符
/* 与(并且) && 全部是true 否则就是false 或(或者) ||至少有一个是true ,就是true 全部是false 才是faalse 非(取反) ! 本来是true,变 ...
- 77th ploty 制图神器
https://blog.csdn.net/u012897374/article/details/77857980
- sublime-1
1.提示找不到margo go get github.com/DisposaBoy/MarGo(该工具已经被作者清空了,大部分人在这一步就被卡住了) 如果你也是在第二步卡住了,那么可以按照我的方法进行 ...