Files
DrupalTutorial/themes/bootstrap/js/dropdown.js
2024-07-15 12:33:27 +02:00

77 lines
2.3 KiB
JavaScript

/**
* @file
* Provides an event handler for hidden elements in dropdown menus.
*/
(function ($, Drupal, Bootstrap) {
'use strict';
/**
* The list of supported events to proxy.
*
* @type {Array}
*/
var events = [
// MouseEvent.
'click', 'dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mouseup', 'mouseover', 'mousemove', 'mouseout',
// KeyboardEvent.
'keypress', 'keydown', 'keyup'
];
/**
* Bootstrap dropdown behaviors.
*
* Proxy any dropdown element events that should actually be fired on the
* original target (e.g. button, submits, etc.). This allows any registered
* event callbacks to be fired as they were intended (despite the fact that
* the markup has been changed to work with Bootstrap).
*
* @see \Drupal\bootstrap\Plugin\Preprocess\BootstrapDropdown::preprocessLinks
*
* @type {Drupal~behavior#bootstrapDropdown}
*/
Drupal.behaviors.bootstrapDropdown = {
attach: function (context) {
var elements = context.querySelectorAll('.dropdown [data-dropdown-target]');
for (var k in elements) {
if (!elements.hasOwnProperty(k)) {
continue;
}
var element = elements[k];
for (var i = 0, l = events.length; i < l; i++) {
var event = events[i];
element.removeEventListener(event, this.proxyEvent);
element.addEventListener(event, this.proxyEvent);
}
}
},
/**
* Proxy event handler for bootstrap dropdowns.
*
* @param {Event} e
* The event object.
*/
proxyEvent: function (e) {
// Ignore tabbing.
if (e.type.match(/^key/) && (e.which === 9 || e.keyCode === 9)) {
return;
}
var target = e.currentTarget.dataset && e.currentTarget.dataset.dropdownTarget || e.currentTarget.getAttribute('data-dropdown-target');
if (target) {
e.preventDefault();
e.stopPropagation();
var element = target && target !== '#' && document.querySelectorAll(target)[0];
if (element) {
Bootstrap.simulate(element, e.type, e);
}
else if (Bootstrap.settings.dev && window.console && !e.type.match(/^mouse/)) {
window.console.debug('[Drupal Bootstrap] Could not find a the target:', target);
}
}
}
}
})(jQuery, Drupal, Drupal.bootstrap);