coder

Наибольший вклад в теги

Все теги (1)

Лучшие ответы пользователя

Все ответы (5)
  • Как запретить закрытие dropdown меню в Bootstrap, при любом действии, кроме клика по кнопке?

    Замени скрипт дропдауна на вот этот

    +function ($) {
    'use strict';

    /**
    * @DROPDOWN CLASS DEFINITION
    *
    */

    var backdrop = '.dropdown-backdrop'
    var toggle = '[data-toggle=dropdown]'
    var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
    }

    Dropdown.prototype.toggle = function (e) {
    var $this = $(this)
    if ($this.is('.disabled, :disabled')) return

    var $parent = getParent($this)
    var isActive = $parent.hasClass('open')

    clearMenus()

    if (!isActive) {
    if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
    // if mobile we use a backdrop because click events don't delegate
    $('').insertAfter($(this)).on('click', clearMenus)
    }

    var relatedTarget = { relatedTarget: this }
    $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))

    if (e.isDefaultPrevented()) return

    $parent
    .toggleClass('open')
    .trigger('shown.bs.dropdown', relatedTarget)

    $this.focus()
    }
    return false
    }

    Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27)/.test(e.keyCode)) return

    var $this = $(this)

    e.preventDefault()
    e.stopPropagation()

    if ($this.is('.disabled, :disabled')) return

    var $parent = getParent($this)
    var isActive = $parent.hasClass('open')

    if (!isActive || (isActive && e.keyCode == 27)) {
    if (e.which == 27) $parent.find(toggle).focus()
    return $this.click()
    }

    var desc = ' li:not(.divider):visible a'
    var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)

    if (!$items.length) return

    var index = $items.index($items.filter(':focus'))

    if (e.keyCode == 38 && index > 0) index-- // up
    if (e.keyCode == 40 && index < $items.length - 1) index++ // down
    if (!~index) index = 0

    $items.eq(index).focus()

    }

    function clearMenus(e) {
    try{

    if($(e.target).closest('.dropdown-menu').length && !$(e.target).hasClass('dropdown-closer')){
    var c = true;
    }else if($(e.target).closest('.dropdown-menu').length && $(e.target).hasClass('dropdown-closer')) {
    var c = false
    }else {
    var c = false
    }
    if($(e.target).closest('.autoclose').length ) {
    var b = true
    }
    }catch(e){}
    $(backdrop).remove()
    $(toggle).each(function () {
    var $parent = getParent($(this))
    var relatedTarget = { relatedTarget: this }
    if (!$parent.hasClass('open')) return
    $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
    //console.log($(e.relatedTarget).hasClass('dontDrop'));
    if (e.isDefaultPrevented()) return

    if(!c || b){
    $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
    }
    })

    }

    function getParent($this) {
    var selector = $this.attr('data-target')

    if (!selector) {
    selector = $this.attr('href')
    selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }

    var $parent = selector && $(selector)

    return $parent && $parent.length ? $parent : $this.parent()
    }

    var old = $.fn.dropdown

    $.fn.dropdown = function (option) {
    return this.each(function () {
    var $this = $(this)
    var data = $this.data('bs.dropdown')

    if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
    if (typeof option == 'string') data[option].call($this)
    })
    }

    $.fn.dropdown.Constructor = Dropdown

    $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
    }
    $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)

    }(jQuery);

    теперь у тебя будет открываться и закрываться дропдаун только по кнопке

    если надо сделать чтобы он работал как раньше
    то добавь класс autoclose на обертку твоего дропдауна как показано ниже

    Dropdown



      если допустим тебе понадобиться чтобы одно из меню дропдауна закрывало его а остальные нет, то надо сделать так

      Dropdown


      • ////// добавив на элемент li класс "dropdown-closer" он будет закрывать дропдаун, остальные 4 элемента - нет
    Ответ написан
    Комментировать