相关环境 及 版本

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 第一级单击的时候选择二级的全部的更多相关文章

  1. word多级编号,如何让第一级为大写“一”,其他级别均为小写1.

    自定义里面设置了第一级为大写,2级.3级首字跟着变为大写,是因为2.3级没有勾选"正规形式编号",如图:

  2. STL——空间的配置和释放std::alloc(第一级配置器和第二级配置器)

    1 空间的配置和释放,std::alloc 对象构造前的空间配置和对象析构后的空间释放,由<stl_alloc.h>负责,SGI对此的设计哲学如下: 向system heap要求空间 考虑 ...

  3. 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。

    /** 转换成XML格式字符串 **/ public static String doXMLStr(Map<String, String> map) { StringBuffer xml_ ...

  4. STL源码分析之第一级配置器

    前言 上一节我们分析了空间配置器对new的配置, 而STL将空间配置器分为了两级, 第一级是直接调用malloc分配空间, 调用free释放空间, 第二级三就是建立一个内存池, 小于128字节的申请都 ...

  5. Bootstrap Table踩坑——设置多级表头后只显示第一级表头问题解决办法

    今天设置了Bootstrap Table的复杂表头,设置了多级表头(两行列名),但是只能显示第一级表头(第一行的列名),第二级的表头被第一级的表头覆盖.但是我仿照其他网上的其他设置复杂表头例子都能正常 ...

  6. Java获取Linux上指定文件夹下所有第一级子文件夹

    说明:需要只获得第一级文件夹目录 package com.sunsheen.jfids.studio.monitor.utils; import java.io.BufferedReader; imp ...

  7. Element UI:级联选择器Cascader_动态加载_多级请求不同接口(已知第一级调取第二级)

    ELEMENT UI_CASCADER 使用过饿了么级联动态加载的小伙伴应该都知道,lazyLoad本身是一个无差别返回渲染结点的函数. 当我们存在一个需求:已知级联选择器的第一级结点,现在需要通过第 ...

  8. easyui datagrid单击单元格选择此列

    示例代码实现单击jquery easyui datagrid的单元格时,取消datagrid默认选中高亮此行的样式,改为选中单击的单元格所在的列,高亮此列上的所有单元格.可以配置全局single变量, ...

  9. Java基础-程序流程控制第一弹(分支结构/选择结构)

    Java基础-程序流程控制第一弹(分支结构/选择结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.if语句 1>.if语句的第一种格式 if(条件表达式){ 语句体: ...

随机推荐

  1. IDEA 创建 Maven web项目注意事项

    需要设置 Maven ->Runner->VM options -Dmaven.multiModuleProjectDirectory=$M2_HOME 需要添加一个archetypeCa ...

  2. maven(二),Linux安装maven3.5.3及配置

    Linux系统,ubuntu-16.04.4,安装maven3.5.3 一.创建文件夹 注意Linux用户,这个如果不是root用户,命令前面需要加:sudo //创建一个目录 mkdir /usr/ ...

  3. Visual Studio Code如何编写运行C、C++

    Visual Studio Code如何编写运行C.C++ 作者:知乎用户链接:https://www.zhihu.com/question/30315894/answer/154979413来源:知 ...

  4. dbvisualizer设置自动补全不显示模式名

  5. 一个简化的插件框架c#

    利用MEF实现插件加载. 定义了一套接口,分别实现插件主界面,插件,业务插件等. 整套加载完全使用MEF2. 所有插件分开,包括主界面也是插件实现. 用一个应用程序,只有Main和插件加载方法.我管它 ...

  6. jackson 问题定位

    问题背景: 云计算Pass平台版本升级,导致引用的jackson的包直接由1.*升级为2.* .在版本1.*中对于字段名与实际json不符的直接忽略了,而在2.*中则会报错.诸如此类,有较大差异,需要 ...

  7. 三、SpringBoot项目探究

    1.pom文件 父项目 <parent> <groupId>org.springframework.boot</groupId> <artifactId> ...

  8. java 逻辑运算符

    /* 与(并且) && 全部是true 否则就是false 或(或者) ||至少有一个是true ,就是true 全部是false 才是faalse 非(取反) ! 本来是true,变 ...

  9. 77th ploty 制图神器

    https://blog.csdn.net/u012897374/article/details/77857980

  10. sublime-1

    1.提示找不到margo go get github.com/DisposaBoy/MarGo(该工具已经被作者清空了,大部分人在这一步就被卡住了) 如果你也是在第二步卡住了,那么可以按照我的方法进行 ...