diff options
Diffstat (limited to 'core/misc/tabbingmanager.js')
-rw-r--r-- | core/misc/tabbingmanager.js | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/core/misc/tabbingmanager.js b/core/misc/tabbingmanager.js index c912c92684e8..5db64002af38 100644 --- a/core/misc/tabbingmanager.js +++ b/core/misc/tabbingmanager.js @@ -13,13 +13,9 @@ function TabbingContext(options) { $.extend(this, { level: null, - $tabbableElements: $(), - $disabledElements: $(), - released: false, - active: false }, options); } @@ -27,27 +23,24 @@ $.extend(TabbingManager.prototype, { constrain: function constrain(elements) { var il = this.stack.length; + for (var i = 0; i < il; i++) { this.stack[i].deactivate(); } var $elements = $(elements).find(':tabbable').addBack(':tabbable'); - var tabbingContext = new TabbingContext({ level: this.stack.length, $tabbableElements: $elements }); - this.stack.push(tabbingContext); - tabbingContext.activate(); - $(document).trigger('drupalTabbingConstrained', tabbingContext); - return tabbingContext; }, release: function release() { var toActivate = this.stack.length - 1; + while (toActivate >= 0 && this.stack[toActivate].released) { toActivate--; } @@ -61,29 +54,28 @@ activate: function activate(tabbingContext) { var $set = tabbingContext.$tabbableElements; var level = tabbingContext.level; - var $disabledSet = $(':tabbable').not($set); - tabbingContext.$disabledElements = $disabledSet; - var il = $disabledSet.length; + for (var i = 0; i < il; i++) { this.recordTabindex($disabledSet.eq(i), level); } $disabledSet.prop('tabindex', -1).prop('autofocus', false); - var $hasFocus = $set.filter('[autofocus]').eq(-1); if ($hasFocus.length === 0) { $hasFocus = $set.eq(0); } + $hasFocus.trigger('focus'); }, deactivate: function deactivate(tabbingContext) { var $set = tabbingContext.$disabledElements; var level = tabbingContext.level; var il = $set.length; + for (var i = 0; i < il; i++) { this.restoreTabindex($set.eq(i), level); } @@ -98,13 +90,16 @@ }, restoreTabindex: function restoreTabindex($el, level) { var tabInfo = $el.data('drupalOriginalTabIndices'); + if (tabInfo && tabInfo[level]) { var data = tabInfo[level]; + if (data.tabindex) { $el[0].setAttribute('tabindex', data.tabindex); } else { $el[0].removeAttribute('tabindex'); } + if (data.autofocus) { $el[0].setAttribute('autofocus', 'autofocus'); } @@ -113,23 +108,23 @@ $el.removeData('drupalOriginalTabIndices'); } else { var levelToDelete = level; + while (tabInfo.hasOwnProperty(levelToDelete)) { delete tabInfo[levelToDelete]; levelToDelete++; } + $el.data('drupalOriginalTabIndices', tabInfo); } } } }); - $.extend(TabbingContext.prototype, { release: function release() { if (!this.released) { this.deactivate(); this.released = true; Drupal.tabbingManager.release(this); - $(document).trigger('drupalTabbingContextReleased', this); } }, @@ -137,7 +132,6 @@ if (!this.active && !this.released) { this.active = true; Drupal.tabbingManager.activate(this); - $(document).trigger('drupalTabbingContextActivated', this); } }, @@ -145,7 +139,6 @@ if (this.active) { this.active = false; Drupal.tabbingManager.deactivate(this); - $(document).trigger('drupalTabbingContextDeactivated', this); } } |