Bootstrap-select关闭liveSearch后键盘向下键功能失效问题
解决bootstrap-select关闭liveSearch后键盘向下键报错的问题
嘿,这个问题我之前碰到过,根源在于关闭liveSearch后组件的DOM结构发生了变化,原代码里的$parent变量没有被正确赋值,导致后续操作找不到元素触发报错。咱们可以用这两种方式解决:
方案一:直接修改bootstrap-select源码(修复根源问题)
找到报错的那行代码,把它调整为下面的写法,确保无论liveSearch是否开启,$parent都能拿到有效的jQuery对象:
// 原代码 // if (that.options.liveSearch) $parent = $this.parent().parent(); // 修改后的代码 $parent = that.options.liveSearch ? $this.parent().parent() : $this.parent();
当liveSearch关闭时,$parent会指向正确的父元素层级,不会再出现未定义的情况。
方案二:自定义键盘事件(无需修改组件源码)
如果不想改动组件源码,可以在初始化bootstrap-select时,添加自定义的keydown事件监听,手动处理向下/向上键的逻辑:
$('.selectpicker').selectpicker({ liveSearch: $('.selectpicker option').length >= 5 // 选项少于5时关闭搜索框 }).on('keydown', function(e) { const selectInstance = $(this).data('selectpicker'); // 只处理liveSearch关闭且按下向下/向上键的场景 if (!selectInstance.options.liveSearch && (e.keyCode === 40 || e.keyCode === 38)) { e.stopPropagation(); // 阻止原组件的错误逻辑执行 // 自定义选项滚动逻辑 const $menu = $(this).next('.dropdown-menu'); const $availableItems = $menu.find('.dropdown-item:not(.disabled)'); const currentActiveIndex = $availableItems.filter('.active').index(); if (e.keyCode === 40) { // 向下键:切换到下一个选项,到末尾则回到开头 const nextIndex = currentActiveIndex === $availableItems.length - 1 ? 0 : currentActiveIndex + 1; $availableItems.removeClass('active').eq(nextIndex).addClass('active'); } else { // 向上键:切换到上一个选项,到开头则回到末尾 const prevIndex = currentActiveIndex === 0 ? $availableItems.length - 1 : currentActiveIndex - 1; $availableItems.removeClass('active').eq(prevIndex).addClass('active'); } } });
这样就能避开原组件的错误代码,同时正常实现键盘滚动选项的功能。
内容的提问来源于stack exchange,提问作者Abirami Thiagu
相关产品推荐
相关产品推荐

