Chosen和Select2是两个比较流行的扩展选择框的库。
两者似乎都得到了积极维护,Chosen 比较老,并且支持 jQuery 和 Prototype。
Select2 只是 jQuery,它的文档说 Select2 是受 Chosen 启发的,但没有详细说明所做的任何改进(如果有的话)或重写的其他原因。
两个库具有几乎相同的功能集,我发现的唯一比较是一个有点不确定的 jsperf 测试页面。
这些库中的任何一个都比其他库有什么优势吗?
从 Select2 3.3.1 开始,以下是其 README.md 中记录的内容
Select2 支持哪些选择不支持?
- 处理大型数据集:Chosen 要求将整个数据集作为
option
标签加载到 DOM 中,这限制了它只能处理小型数据集。Select2 使用一个函数来即时查找结果,这允许它部分加载结果。- 结果分页:由于 Select2 适用于大型数据集,并且一次只加载少量匹配结果,因此它必须支持分页。当用户滚动到当前加载的结果集的底部时,Select2 将调用搜索函数,从而允许“无限滚动”结果。
- 结果的自定义标记:选择仅支持呈现文本结果,因为这是标签支持的唯一标记
option
。Select2 提供了一个扩展点,可用于生成任何类型的标记来表示结果。- 动态添加结果的能力:Select2 提供了从用户输入的搜索词添加结果的能力,这允许它用于标记。
恕我直言,选择是“维护”但不是“积极维护”。Chosen 的 341 个问题和 51 个拉取请求。Select2 有 128 个问题和 25 个拉取请求。我认为这些模式基本上是
无论您选择哪一个,如果您的用例恰好处于最佳位置,那么任何一个都可以工作。如果没有,您最终将不得不自己编写或大量定制这些内容。在任何一种情况下,具体选择哪一个都不是那么重要。我想我会在这里支持@Andy Ray 和@paul,Select2 可能是更好的初始选择。
另一个值得一提的区别是,Chosen
是在和中开发的Sass
,CoffeeScript
而Select2
在普通CSS
和JS
中。这是我个人的选择,Sass
并且CoffeeScript
是不必要的复杂层,这使得调试变得困难。
在尝试了这两种方法之后,我决定不使用任何一种 - 尝试获得Select2
创建项目功能结果是一件非常麻烦的事情,因为当附加到元素时你根本无法做到<select>
- 它只是觉得我没有好好考虑过我会拥有的箍跳过。
我已经决定使用selectize.js,它只是将新<option>...</option>
元素添加到表单的 DOM 中——这很正常。它也确实使用LESS
- 但我会绕过它,CSS
直接在你的项目中定制编译。
附言。当我了解有关缺失点的更多信息时,我将尝试更新此答案
首先,让我告诉你 Chosen 和 Select2 是两个很棒的插件,这是我对 Chosen 的个人体验。他们所说的关于天选者的一切都是真实的。
Pēteris Caune 指出的问题select
已有 2 年历史,但仍然没有官方修复。API 根本没有好的文档。已经多次指出(观看第 671 期),但仍然一无所获。他们花了将近 2 年的时间来解决这个问题,如果在显示 div 之前将其隐藏,则选择基本上不起作用overflow:hidden
(并且您必须使用一个witdh:X%
如果您不寻找问题,您基本上永远不会知道的选项)。
我会说主要问题是修复速度,如第 92 期中所说的 DelvarWorld:
我的拉取请求解决了这个问题,但就像我的另一个和许多选择的一样,它们被忽略了。这个项目的贡献者太多,代码库太少。
我首先选择 Chosen 是因为它的 MIT 许可证,但我遇到了所有这些问题(下拉菜单,找不到 API,寻找隐藏溢出的时间),所以我决定切换到 select2,因为它有更好的文档,没有下拉菜单错误和更快的修复。
在 Select2 中有效但在 Chosen 中无效的一项功能是select
在具有overflow: hidden
or的元素内部overflow: auto
。
Chosen 的对应问题:https ://github.com/harvesthq/chosen/issues/86
我发现使用这两个插件的一些差异:
使用 select2,您可以在选项中的任何位置进行搜索。例如,如果您有一个名为 ABCDEFG 的选项并且您输入 CDE,您将在搜索结果中获得该选项,但选择后您必须输入 AB.. 等等才能获得结果。
我发现对于较大的数据集,choose 似乎比 select2 更快,尤其是在 IE 中。
Select2 支持移动设备,而 Chosen专门在 iPod、iPhone 和移动 Android 上禁用自身。如果您想在移动设备上使用“扩展”选择框,这使您的选择变得容易。
我在桌面上使用 Select2 的体验很棒,但在触控移动设备上却大不相同,总有一些怪癖。例如,在带有 ics 和股票浏览器下拉菜单的 xperia st15i 上,由于键盘窃取焦点,它总是自行关闭。再次打开它的唯一方法是触摸菜单数十次,按住手指一秒钟以及其他巫术魔法。或者在下拉列表关闭时开始输入,有多少用户会解决这个问题?
selectize.js似乎比select2更平滑,但是它在选择值或输入时也会在移动设备上单独出现问题,以便出于某种原因将页面一直移至左侧。此外,在不支持溢出的较旧的 Android 2.x 设备上,无法选择超过几个顶部选项,因为键盘不会弹出。:(
仍然必须测试 Chosen,毕竟禁用移动设备可能不是一个坏主意,但最终好的旧下拉菜单始终无处不在。
更新:现在我也测试了 Chosen,它在一个方面更好:默认情况下它在移动设备上不起作用(太棒了!),但它有过滤单词的问题。例如,不在单词中间搜索,如果你使用 hack 进行对齐,它也会忽略完整的选项。回到绘图板。
为什么我选择 select2 而不是 Chosen
select2 具有的关键功能,没有其他控件具有自动神奇功能,是“清除所有”选择,控件右侧带有“x”。这是我的应用程序的杀手级功能。我不知道为什么其他选择标签增强库缺少此功能。
Select2 支持 AJAX 选择不支持
选择 2 的尺寸比选择的要重一些。
我切换到 Select2 因为没有官方支持 ajax 操作。