Закройте раскрывающийся список Bootstrap, содержащий активный элемент Select2 при размытии

У меня есть случай, когда требуется два щелчка, чтобы закрыть раскрывающийся список Bootstrap. Мне нужно, чтобы оба закрывались, когда щелчок происходит за пределами раскрывающегося списка, скажем, на другой кнопке раскрывающегося списка.

То же самое, вероятно, происходит со стандартным элементом выбора, но это мой конкретный сценарий. Я безуспешно пытался вызвать dropdown('close') при нажатии различных элементов Select2.

http://jsfiddle.net/isherwood/PwNpB/15

<div class="dropdown">
    <span data-toggle="dropdown" class="btn  dropdown-toggle">
        Button <span class="caret pull-right"></span>
    </span>

    <div class="dropdown-menu">
        <select id="e1">
            <option value="AL">Alabama</option>
            <option value="WY">Wyoming</option>
        </select>
    </div>
</div>

person isherwood    schedule 01.04.2013    source источник
comment
В каком браузере вы столкнулись с этой проблемой? Я тестировал Safari 6.0.2 и Chrome 26.0.1410.43, и, похоже, он работает правильно.   -  person couzzi    schedule 04.04.2013
comment
Похоже, что select2 вызывает это. Никакие элементы управления не получат фокус, пока вы не закроете форму. К сожалению, элемент управления не имеет события Close.   -  person Matus    schedule 04.04.2013
comment
Я работаю в основном в Firefox на Win7. Однако мы сталкиваемся с той же проблемой и в других браузерах. Я вижу, что в Chrome требуется два клика.   -  person isherwood    schedule 04.04.2013


Ответы (2)


Вы можете использовать этот обходной путь:

// initialize Select2 
$("#e1").select2().on('open', function () {
    $('#select2-drop-mask')
       .height($(window).height())
       .width($(window).width())
       .css('opacity', .1);
});


$(document).on('mousedown', '#select2-drop-mask', function () {
    $('.dropdown.open').removeClass('open');
});

ПОСМОТРЕТЬ JSFIDDLE

person A. Wolff    schedule 05.04.2013
comment
Казалось бы, дело в этом. Это тоже красиво и просто. Большое спасибо. Завтра проведу кроссбраузерное тестирование. - person isherwood; 06.04.2013
comment
Не пытаясь отнять у этого решения, но это также вызывает ошибку 0x80004005 (NS_ERROR_FAILURE) [nsIDOMHTMLInputElement.setSelectionRange] в Firefox, описанную ниже. @roasted, почему вы сами устанавливаете высоту и ширину для #select-drop-mask? Я думал, что это то, что select2 уже делает сам в _makeMaskCss ? Является ли непрозрачность демонстрационными целями? - person fk_; 06.04.2013
comment
Я применил функцию mousedown (без расширенного инициализатора Select2) к моей ситуации, и она работает хорошо. Я не получаю ошибок в IE9, Firefox или Chrome. Спасибо еще раз. - person isherwood; 06.04.2013
comment
Пожалуйста! jsfiddle.net/PwNpB/42 показывает, что, по крайней мере, в изолированном тестовом примере (теперь без open прослушиватель событий) ошибка Firefox сохраняется - что имеет смысл, я просто упоминаю об этом для полноты картины. Рад, что это работает для вас! Эти тайм-ауты для обработки ошибки Firefox казались неприятными, и это, безусловно, лучшее решение. - person fk_; 06.04.2013
comment
@А. Вольф: Отличный ответ. Отлично работает во всех браузерах, кроме IE8+ jsfiddle.net/PwNpB/75. выпадающий список исчезает. Я установил stopPropagation для элемента с классом выпадающего меню. Тем не менее, я думаю, что в файле select2.js stopPropagation() и preventDefault() в строках с номерами 1304 и 1305 вызывают эту проблему. Любая помощь приветствуется. - person prajan; 08.03.2014
comment
Похоже на ошибку в плагине Select2. Вы должны спросить их, как это можно исправить. Например, здесь обновление до select2 3.4.5 устраняет эту ошибку, но появляются некоторые другие, которые, похоже, не связаны с кодом, размещенным здесь: jsfiddle.net/PwNpB/77/show - person A. Wolff; 08.03.2014
comment
@A.Wolff У меня похожая проблема, но я не использую Bootstrap, и если я удалю ее из скрипки, упомянутой в вашем ответе, даже это не сработает. Обновлен скрипт. - person Rajesh; 07.04.2016

Хотя я на самом деле не знаком ни с twitter-bootstrap, ни с select2 (и не очень хорошо знаю JavaScript), я заметил, что select2 вставляет элемент с именем #select2-drop-mask, который захватывает mousedown- и touchstart-события и обрабатывает закрытие select2- падать:

mask.bind("mousedown touchstart", function (e) {
    var dropdown = $("#select2-drop"), self;
    if (dropdown.length > 0) {
        self=dropdown.data("select2");
        if (self.opts.selectOnBlur) {
            self.selectHighlighted({noFocus: true});
        }
        self.close();
    }
});

Если мы прикрепим те же самые события (простой click не будет работать) к document и убедимся, что выбранный элемент на самом деле является #select2-drop-mask (иначе bootstrap-tooltips 'toggle' будет вызываться дважды), кажется, что все ведет себя так, как вы хотите — раскрывающийся список twitter-bootstrap закрыт всякий раз, когда щелкают что-то за пределами элемента select2:

function closeBootstrapDropdown() {
    if ($(event.target).is('#select2-drop-mask')) {
        // toggle the twitter-bootstrap dropdown
        $('.dropdown.open .dropdown-toggle').dropdown('toggle');
    }
}

$(document).on('mousedown touchstart', closeBootstrapDropdown);

Вот http://jsfiddle.net/PwNpB/3/ — хотя кажется, что это работает, все еще кажется мне немного грязным, поэтому я надеюсь, что кто-то с реальным пониманием того, что здесь происходит и почему, вмешается.

person fk_    schedule 03.04.2013
comment
Спасибо за ваши усилия, но ваша скрипка по-прежнему требует двух щелчков мыши в области вокруг раскрывающегося списка, чтобы полностью закрыть его. Он ведет себя как мой пример. Я что-то упускаю? Я в Firefox на Win7. - person isherwood; 04.04.2013
comment
Я понимаю, что вы говорите; До сих пор я тестировал только в Chrome — не могли бы вы проверить поведение там, чтобы нам было ясно, что именно так вы хотите, чтобы все работало в разных браузерах? Посмотрю еще раз после работы. - person fk_; 04.04.2013
comment
jsfiddle.net/PwNpB/9 работает в Firefox, но select2 выдает ошибку (в отличие от в Chrome), связанный (с тем, что я могу сделать из быстрого поиска), фокусируя скрытое поле ввода. - person fk_; 04.04.2013
comment
Мне удалось устранить ошибку, изменив раскрывающийся список ('toggle') на fadeOut(), но тогда кнопка стала неработоспособной. jsfiddle.net/isherwood/PwNpB/13 - person isherwood; 04.04.2013
comment
jsfiddle.net/PwNpB/18 (не мной, я просто наткнулся на это) работает для меня в поздних версиях Firefox, Chrome и Safari на Mac — используется тайм-аут для задержки скрытия выпадающего меню начальной загрузки, что предотвращает ошибку Firefox. Извините за невежественное тестирование, сейчас не могу подключиться к моему Windows на работе. - person fk_; 06.04.2013
comment
Я также наткнулся на эти select2 github issues и таким образом дал шанс select2s 'close'-event; поведение отличается от моего исходного ответа, так как раскрывающийся список начальной загрузки не остается открытым после изменения параметра select2: jsfiddle.net/PwNpB/22 - однако это вызывает ту же ошибку в Firefox. jsfiddle.net/PwNpB/41 включает обходной путь, упомянутый в моем предыдущем комментарии. - person fk_; 06.04.2013
comment
Я думаю, что это также мои попытки изменить ваш ответ. Все они, как правило, вызывали другие проблемы с множественным выбором внутри моего раскрывающегося списка. Еще раз спасибо за ваши усилия. - person isherwood; 06.04.2013
comment
Без проблем! (кстати, 22 и 41 были одни, насколько я помню :)) - person fk_; 06.04.2013
comment
Более полезный, чем принятый ответ ... Спасибо +1. Установка $('.select2-drop-mask ').css('height','100%'); }) для обратного вызова "select2-open решила проблему в моем случае - person Deadlock; 24.05.2013