0d9e315a7f3fb2ae47f7598bef46f216eebf8ca5
[yaffs-website] / js / dropdown.js
1 /**
2  * @file
3  * Provides an event handler for hidden elements in dropdown menus.
4  */
5
6 (function ($, Drupal, Bootstrap) {
7   'use strict';
8
9   /**
10    * The list of supported events to proxy.
11    *
12    * @type {Array}
13    */
14   var events = [
15     // MouseEvent.
16     'click', 'dblclick', 'mousedown', 'mouseenter', 'mouseleave', 'mouseup', 'mouseover', 'mousemove', 'mouseout',
17
18     // KeyboardEvent.
19     'keypress', 'keydown', 'keyup'
20   ];
21
22   /**
23    * Bootstrap dropdown behaviors.
24    *
25    * Proxy any dropdown element events that should actually be fired on the
26    * original target (e.g. button, submits, etc.). This allows any registered
27    * event callbacks to be fired as they were intended (despite the fact that
28    * the markup has been changed to work with Bootstrap).
29    *
30    * @see \Drupal\bootstrap\Plugin\Preprocess\BootstrapDropdown::preprocessLinks
31    *
32    * @type {Drupal~behavior#bootstrapDropdown}
33    */
34   Drupal.behaviors.bootstrapDropdown = {
35     attach: function (context) {
36       var elements = context.querySelectorAll('.dropdown [data-dropdown-target]');
37       for (var k in elements) {
38         if (!elements.hasOwnProperty(k)) {
39           continue;
40         }
41         var element = elements[k];
42         for (var i = 0, l = events.length; i < l; i++) {
43           var event = events[i];
44           element.removeEventListener(event, this.proxyEvent);
45           element.addEventListener(event, this.proxyEvent);
46         }
47       }
48     },
49
50     /**
51      * Proxy event handler for bootstrap dropdowns.
52      *
53      * @param {Event} e
54      *   The event object.
55      */
56     proxyEvent: function (e) {
57       // Ignore tabbing.
58       if (e.type.match(/^key/) && (e.which === 9 || e.keyCode === 9)) {
59         return;
60       }
61       var target = e.currentTarget.dataset && e.currentTarget.dataset.dropdownTarget || e.currentTarget.getAttribute('data-dropdown-target');
62       if (target) {
63         e.preventDefault();
64         e.stopPropagation();
65         var element = target && target !== '#' && document.querySelectorAll(target)[0];
66         if (element) {
67           Bootstrap.simulate(element, e.type, e);
68         }
69         else if (Bootstrap.settings.dev && window.console && !e.type.match(/^mouse/)) {
70           window.console.debug('[Drupal Bootstrap] Could not find a the target:', target);
71         }
72       }
73     }
74   }
75
76 })(jQuery, Drupal, Drupal.bootstrap);