You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
4.3 KiB
169 lines
4.3 KiB
/* ============================================================ |
|
* bootstrap-dropdown.js v2.3.2 |
|
* http://twitter.github.com/bootstrap/javascript.html#dropdowns |
|
* ============================================================ |
|
* Copyright 2012 Twitter, Inc. |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
* ============================================================ */ |
|
|
|
|
|
!function ($) { |
|
|
|
"use strict"; // jshint ;_; |
|
|
|
|
|
/* DROPDOWN CLASS DEFINITION |
|
* ========================= */ |
|
|
|
var toggle = '[data-toggle=dropdown]' |
|
, Dropdown = function (element) { |
|
var $el = $(element).on('click.dropdown.data-api', this.toggle) |
|
$('html').on('click.dropdown.data-api', function () { |
|
$el.parent().removeClass('open') |
|
}) |
|
} |
|
|
|
Dropdown.prototype = { |
|
|
|
constructor: Dropdown |
|
|
|
, toggle: function (e) { |
|
var $this = $(this) |
|
, $parent |
|
, isActive |
|
|
|
if ($this.is('.disabled, :disabled')) return |
|
|
|
$parent = getParent($this) |
|
|
|
isActive = $parent.hasClass('open') |
|
|
|
clearMenus() |
|
|
|
if (!isActive) { |
|
if ('ontouchstart' in document.documentElement) { |
|
// if mobile we we use a backdrop because click events don't delegate |
|
$('<div class="dropdown-backdrop"/>').insertBefore($(this)).on('click', clearMenus) |
|
} |
|
$parent.toggleClass('open') |
|
} |
|
|
|
$this.focus() |
|
|
|
return false |
|
} |
|
|
|
, keydown: function (e) { |
|
var $this |
|
, $items |
|
, $active |
|
, $parent |
|
, isActive |
|
, index |
|
|
|
if (!/(38|40|27)/.test(e.keyCode)) return |
|
|
|
$this = $(this) |
|
|
|
e.preventDefault() |
|
e.stopPropagation() |
|
|
|
if ($this.is('.disabled, :disabled')) return |
|
|
|
$parent = getParent($this) |
|
|
|
isActive = $parent.hasClass('open') |
|
|
|
if (!isActive || (isActive && e.keyCode == 27)) { |
|
if (e.which == 27) $parent.find(toggle).focus() |
|
return $this.click() |
|
} |
|
|
|
$items = $('[role=menu] li:not(.divider):visible a', $parent) |
|
|
|
if (!$items.length) return |
|
|
|
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() { |
|
$('.dropdown-backdrop').remove() |
|
$(toggle).each(function () { |
|
getParent($(this)).removeClass('open') |
|
}) |
|
} |
|
|
|
function getParent($this) { |
|
var selector = $this.attr('data-target') |
|
, $parent |
|
|
|
if (!selector) { |
|
selector = $this.attr('href') |
|
selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 |
|
} |
|
|
|
$parent = selector && $(selector) |
|
|
|
if (!$parent || !$parent.length) $parent = $this.parent() |
|
|
|
return $parent |
|
} |
|
|
|
|
|
/* DROPDOWN PLUGIN DEFINITION |
|
* ========================== */ |
|
|
|
var old = $.fn.dropdown |
|
|
|
$.fn.dropdown = function (option) { |
|
return this.each(function () { |
|
var $this = $(this) |
|
, data = $this.data('dropdown') |
|
if (!data) $this.data('dropdown', (data = new Dropdown(this))) |
|
if (typeof option == 'string') data[option].call($this) |
|
}) |
|
} |
|
|
|
$.fn.dropdown.Constructor = Dropdown |
|
|
|
|
|
/* DROPDOWN NO CONFLICT |
|
* ==================== */ |
|
|
|
$.fn.dropdown.noConflict = function () { |
|
$.fn.dropdown = old |
|
return this |
|
} |
|
|
|
|
|
/* APPLY TO STANDARD DROPDOWN ELEMENTS |
|
* =================================== */ |
|
|
|
$(document) |
|
.on('click.dropdown.data-api', clearMenus) |
|
.on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) |
|
.on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) |
|
.on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) |
|
|
|
}(window.jQuery);
|
|
|