Держите select2 открытым только при выборе Shift

Я использую 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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
751
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, у вас есть два варианта. Возможно, вы не знаете, но select2, похоже, выполняет аналогичную функцию; он проверяет, удерживается ли управляющий ключ. Посмотрим select2.js и поищем // Don't close if the control key is being held. Я думаю, что легко изменить эту часть плагина напрямую, а не реализовывать его самостоятельно. (Я не смог найти способ перезаписать функцию.)

Впрочем, я тоже нашел способ. Но, может быть, иногда не удается предотвратить закрытие select2 ...

Во-первых, вам нужно событие keydown и keyup во 2 части.

// 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 все еще существует. Например.

ОБНОВЛЕНО
Добавьте логику с учетом «Если его несколько» и «Если его нет». Так, на всякий случай.

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; вверху. Есть ли что-нибудь, что мне нужно подумать с точки зрения порядка всего этого? Спасибо!

SeaBass 27.07.2018 20:44

Ха, действительно работает! Проблема заключалась в том, что у меня есть несколько select2, к которым я хочу применить его, и работает только первый. Позже я попробовал несколько случайных. Как я могу применить один и тот же трюк со сдвигом к каждому выбору определенного класса? Еще раз спасибо!

SeaBass 27.07.2018 21:18

Я обновил ваш jsfiddle :) Как мне заставить его работать на них обоих? И в том смысле, что это только select2 того же класса, поскольку будут другие поля select2, на которые это не должно влиять.

SeaBass 27.07.2018 21:23

Я также получаю сообщение document.getElementsByClassName(...)[0] is undefine на страницах, где нет select2. Есть ли способ применить его, только если они существуют?

SeaBass 27.07.2018 21:45

Извините за рассылку спама, но я сделал то, что вы сказали, и изменил исходный код на if (originalEvent && (originalEvent.ctrlKey || originalEvent.shiftKey) ), и он отлично работает! Когда я думаю об этом, не имеет значения, применимо ли это к каждому select2. Еще раз спасибо!

SeaBass 27.07.2018 21:50

Если несколько, вам нужна та же логика, например document.getElementsByClassName (...) [1] ... (это то же самое, что и $ (". Class")). Во всяком случае, похоже, что лучше всего сменить плагин. Я рада, что смогла помочь!

Ballsigno 28.07.2018 00:33

На всякий случай обновил свой ответ и URL-адрес jsfiddle.

Ballsigno 28.07.2018 01:11

Спасибо! Как вы думаете, из-за того, что события select2 произошли до jQuery, он не работал с использованием jQuery? Я был в подобной ситуации раньше.

SeaBass 28.07.2018 03:09

Я просто понимаю, что jQuery's key event работает, пока не добавлю пункт. Я проверил событие keydown с помощью инструмента разработчика. и заметил, что событие было удалено, когда я добавлял элемент. Однако я не знаю, почему обычное событие javascript может избежать удаления.

Ballsigno 28.07.2018 05:23

Другие вопросы по теме