diff --git a/src/components/sidenav/sidenav.js b/src/components/sidenav/sidenav.js index 02d5300fc3..283272e8ab 100644 --- a/src/components/sidenav/sidenav.js +++ b/src/components/sidenav/sidenav.js @@ -225,9 +225,10 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $animate, /** * Directive Post Link function... */ - function postLink(scope, element, attr, sidenavCtrl) { + function postLink(scope, element, attr, sidenavCtrl, $timeout) { var lastParentOverFlow; var triggeringElement = null; + var isKeyboardInteraction; var promise = $q.when(true); var isLockedOpenParsed = $parse(attr.mdIsLockedOpen); @@ -244,9 +245,38 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $animate, $mdTheming.inherit(backdrop, element); + var body = angular.element(document.body); + var _mouseEvent = window.MSPointerEvent ? 'MSPointerDown' : window.PointerEvent ? 'pointerdown' : 'mousedown'; + + body.on('keydown', onInput); + body.on(_mouseEvent, onInput); + body.on('mouseenter', onInput); + if ('ontouchstart' in document.documentElement) body.on('touchstart', onBufferInput); + + var buffer = false, timer; + + function onInput(event) { + if (buffer) return; + isKeyboardInteraction = event.type === 'keydown'; + } + + function onBufferInput(event) { + $timeout.cancel(timer); + onInput(event); + buffer = true; + timer = $timeout(function() { + buffer = false; + }, 1000); + } + element.on('$destroy', function() { backdrop.remove(); sidenavCtrl.destroy(); + + body.off('keydown', onInput); + body.off(_mouseEvent, onInput); + body.off('mouseenter', onInput); + if ('ontouchstart' in document.documentElement) body.off('touchstart', onBufferInput); }); scope.$on('$destroy', function(){ @@ -344,9 +374,9 @@ function SidenavDirective($mdMedia, $mdUtil, $mdConstant, $mdTheming, $animate, // When the current `updateIsOpen()` animation finishes promise.then(function(result) { - if ( !scope.isOpen ) { + if ( !scope.isOpen && triggeringElement && isKeyboardInteraction) { // reset focus to originating element (if available) upon close - triggeringElement && triggeringElement.focus(); + triggeringElement.focus(); triggeringElement = null; }