Skip to content

Instantly share code, notes, and snippets.

@bradroberts
Last active August 29, 2015 14:03
Show Gist options
  • Save bradroberts/b7aa2567259a260c4628 to your computer and use it in GitHub Desktop.
Save bradroberts/b7aa2567259a260c4628 to your computer and use it in GitHub Desktop.

Revisions

  1. bradroberts revised this gist Jul 14, 2014. 1 changed file with 6 additions and 1 deletion.
    7 changes: 6 additions & 1 deletion dropdown.js
    Original file line number Diff line number Diff line change
    @@ -28,8 +28,13 @@

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

    clearMenus()
    if (! isSubMenu)
    clearMenus()

    if (isSubMenu && isActive)
    $parent.removeClass('open');

    if (!isActive) {
    if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
  2. bradroberts created this gist Jul 14, 2014.
    151 changes: 151 additions & 0 deletions dropdown.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,151 @@
    /* ========================================================================
    * Bootstrap: dropdown.js v3.2.0
    * http://getbootstrap.com/javascript/#dropdowns
    * ========================================================================
    * Copyright 2011-2014 Twitter, Inc.
    * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
    * ======================================================================== */


    +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.VERSION = '3.2.0'

    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
    $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
    }

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

    if (e.isDefaultPrevented()) return

    $this.trigger('focus')

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

    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).trigger('focus')
    return $this.trigger('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).trigger('focus')
    }

    function clearMenus(e) {
    if (e && e.which === 3) return
    $(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))
    if (e.isDefaultPrevented()) return
    $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()
    }


    // DROPDOWN PLUGIN DEFINITION
    // ==========================

    function Plugin(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)
    })
    }

    var old = $.fn.dropdown

    $.fn.dropdown = Plugin
    $.fn.dropdown.Constructor = Dropdown


    // DROPDOWN NO CONFLICT
    // ====================

    $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
    }


    // APPLY TO STANDARD DROPDOWN ELEMENTS
    // ===================================

    $(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);