From 9b57c2ecbc301bc98c0b4ff7858316eb869de7cb Mon Sep 17 00:00:00 2001 From: Ryan Schmukler Date: Thu, 16 Jul 2015 14:33:29 -0400 Subject: [PATCH] fix(menu): cleanup click listeners on close --- src/components/menu/menu-interim-element.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/components/menu/menu-interim-element.js b/src/components/menu/menu-interim-element.js index 9fc726ba731..5eb54ee4970 100644 --- a/src/components/menu/menu-interim-element.js +++ b/src/components/menu/menu-interim-element.js @@ -66,7 +66,7 @@ function MenuProvider($$interimElementProvider) { return animator .waitTransitionEnd(element, {timeout: 370}) .then( function(response) { - activateInteraction(); + opts.cleanupInteraction = activateInteraction(); return response; }); @@ -149,7 +149,7 @@ function MenuProvider($$interimElementProvider) { }); // Close menu on menu item click, if said menu-item is not disabled - opts.menuContentEl[0].addEventListener('click', function(e) { + var captureClickListener = function(e) { var target = e.target; // Traverse up the event until we get to the menuContentEl to see if // there is an ng-click and that the ng-click is not disabled @@ -181,12 +181,20 @@ function MenuProvider($$interimElementProvider) { } return false; } - }, true); + }; + opts.menuContentEl[0].addEventListener('click', captureClickListener, true); // kick off initial focus in the menu on the first element var focusTarget = opts.menuContentEl[0].querySelector('[md-menu-focus-target]'); if (!focusTarget) focusTarget = opts.menuContentEl[0].firstElementChild.firstElementChild; focusTarget.focus(); + + return function cleanupInteraction() { + element.removeClass('md-clickable'); + opts.backdrop.off('click'); + opts.menuContentEl.off('keydown'); + opts.menuContentEl[0].removeEventListener('click', captureClickListener, true); + }; } } @@ -239,8 +247,9 @@ function MenuProvider($$interimElementProvider) { */ function onRemove(scope, element, opts) { opts.isRemoved = true; - element.addClass('md-leave') - .removeClass('md-clickable'); + element.addClass('md-leave'); + + opts.cleanupInteraction(); // Disable resizing handlers angular.element($window).off('resize', opts.resizeFn);