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(条件表达式){ 语句体: ...
随机推荐
- hive中not in优化
比如:A,B两表,找到ID字段中,存在A表,但不存在B表的数据. A表共13w,去重后3w,B表共2W,且有索引 方法一 not in,易理解,效率低,时间:1.395s )
- python学习笔记之入门
1.变量 变量即为可以改变的量,值是可以更改的. 如何定义 name = ‘name’ age = 20 .......... 变量的定义规范 1.变量名只能是 字母.数字或下划线的任意组合 .2. ...
- Excel中数字和字母混合时提取某些字符进行排序
在excel中,当数字和字母混合在一起的时候,会出现排序错误的情况 比如下图的这种情况.我们希望的是2排在1后面,但是实际上10却排在了1的后面.这时候我们就需要把字符串中的数字提取出来进行排序 第一 ...
- pyppeteer模块的基本使用
pyppeteer模块的基本使用 引言 Selenium 在被使用的时候有个麻烦事,就是环境的相关配置,得安装好相关浏览器,比如 Chrome.Firefox 等等,然后还要到官方网站去下载对应的驱动 ...
- Learning OSG programing---osgwindows
/* OpenSceneGraph example, osgwindows. * * Permission is hereby granted, free of charge, to any pers ...
- static_cast关键字 dynamic_cast关键字
前言 说起C++中的继承.多态.虚函数等概念,可能很多同学都有所了解,但是要说真正熟知的同学可能就不是很多了.最近在编程过程中了解到C++类型的层次转换(这就涉及到了多态和继承的相关概率),通常C语言 ...
- Java面试宝典(3)Java基础部分
51.启动一个线程是用run()还是start()? . 启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关 ...
- Codeforces Fix a Tree
Fix a Tree time limit per test2 seconds A tree is an undirected connected graph without cycles. Let' ...
- Codeforces 360C DP 计算贡献
题意:给你一个长度为n的字符串,定义两个字符串的相关度为两个串对应的子串中第一个串字典序大于第二个串的个数.现在给你相关度,和第二个串,问满足条件的第一个串有多少个? 思路:设dp[i][j]为填了前 ...
- 使用CSS3的@media来编写响应式的页面
首先要知道,我们为什么要写自适应的页面(响应式页面) [直接看干货] 众所周知,电脑.平板.手机的屏幕是差距很大的,假如在电脑上写好了一个页面,在电脑上看起来不错,但是如果放到手机上的话,那可能就会乱 ...