【问题标题】:Keep select2 open only on shift-select仅在 shift-select 时保持 select2 打开
【发布时间】:2018-07-27 00:40:34
【问题描述】:

我使用 select2 添加标签。有一个选项可以在选择项目时保持选择列表打开 (closeOnSelect),但是只有在选择项目时按下 shift 键,我才能做到这一点?尝试将 closeOnSelect 设置为 false 以查看我希望仅在按下 shift 键时发生的情况。

以下是 API 选项列表:https://select2.org/configuration/options-api

这里是事件列表:https://select2.org/programmatic-control/events

$(".form-control").select2({
    tags: true,
    tokenSeparators: [',', ' '],
    closeOnSelect: true
})
.on('select2:select', function (e) {
    // How can I reach shiftKey here?
    if( e.shiftKey )
    {
        alert('How do I make closeOnSelect: false happen here?');
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>
<select class="form-control" multiple="multiple" style="width: 300px">
  <option selected="selected">orange</option>
  <option>white</option>
  <option selected="selected">purple</option>
</select>

【问题讨论】:

    标签: javascript jquery jquery-plugins jquery-select2


    【解决方案1】:

    我认为你有两个选择。 你可能不知道,select2 好像有类似的功能;它检查是否正在按住控制键。 让我们看看select2.js,然后搜索// Don't close if the control key is being held。 我认为您直接修改插件的那部分很容易,而不是自己实现。
    (我找不到覆盖函数的方法。)

    不过,我也找到了方法。
    但也许有时无法阻止关闭select2 ...

    首先,你需要在第二部分keydownkeyup事件。

    // jQuery keydown doesn't work for some reason.(It seems this plugin is a bit tricky.)
    // This event is used when the text box has focus.
    document.getElementsByClassName('select2-search__field')[0].onkeydown = function(e) {
        if (e.keyCode === 16) {
            isShiftDown = true;
        }
    }
    document.getElementsByClassName('select2-search__field')[0].onkeyup = function(e) {
        if (e.keyCode === 16) {
            isShiftDown = false;
        }
    }
    
    // This event is used when the text box doesn't has focus.
    $(window).on("keydown", function(e) {
        if (e.keyCode === 16) {
            isShiftDown = true;
        }
    }).on("keyup", function(e) {
        if (e.keyCode === 16) {
            isShiftDown = false;
        }
    });
    

    其次,添加closing事件。

    // Closing (if you return false in this event, select2 doesn't close.)
    .on('select2:closing', function () {
        // To be exact, there's no need to return true.
        return !isShiftDown;
    });
    

    当然,即使你成功实现了,Ctrl键功能依然存在。
    For Example.

    更新
    添加逻辑,考虑“如果它是多个”和“如果它不存在”。以防万一。

    var inputs = document.getElementsByClassName('select2-search__field');
    if (inputs.length > 0) {
        for (var i=0; i<inputs.length; i++) {
            inputs[i].onkeydown = function(e) {
                if (e.keyCode === 16) {
                    isShiftDown = true;
                }
            }
            inputs[i].onkeyup = function(e) {
                if (e.keyCode === 16) {
                    isShiftDown = false;
                }
            }
        }
    }
    

    【讨论】:

    • 这看起来很有希望!谢谢!我收到了这条消息TypeError: document.getElementsByClassName(...)[0] is undefined 我试图将它放入window.onload = function() 并且消息消失了,但它似乎没有为select2 触发。我还有一个ReferenceError: isShiftDown is not defined,在顶部添加var isShiftDown = false; 后消失了。就所有这些的顺序而言,我需要考虑什么吗?谢谢!
    • 哈,它确实有效!问题是我有一堆我想应用它的select2s,只有第一个有效。后来我尝试了一些随机的。我怎样才能对特定班级的每个选择应用相同的班次技巧?再次感谢!
    • 我更新了你的 jsfiddle :) 我怎样才能让它在他们两个上工作?并且在某种程度上它只是同一类的 select2,因为会有其他 select2 框不应该影响。
    • 我还在不存在 select2 的页面上收到 document.getElementsByClassName(...)[0] is undefine 消息。有什么方法可以仅在它们存在时应用它?
    • 如果多个,则需要相同的逻辑,如 document.getElementsByClassName(...)[1]...(这与 $(".class") 相同)。无论如何,似乎更改插件是最好的方法。我很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2019-02-21
    • 1970-01-01
    • 2021-12-28
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多