|
6 | 6 | * found in the LICENSE file at https://angular.dev/license |
7 | 7 | */ |
8 | 8 |
|
9 | | -import {AfterContentInit, Directive, EventEmitter, inject, OnDestroy, Output} from '@angular/core'; |
| 9 | +import { |
| 10 | + AfterContentInit, |
| 11 | + Directive, |
| 12 | + ElementRef, |
| 13 | + EventEmitter, |
| 14 | + inject, |
| 15 | + OnDestroy, |
| 16 | + Output, |
| 17 | +} from '@angular/core'; |
10 | 18 | import {ESCAPE, hasModifierKey, LEFT_ARROW, RIGHT_ARROW, TAB} from '../keycodes'; |
| 19 | +import {_getEventTarget} from '../platform'; |
11 | 20 | import {takeUntil} from 'rxjs/operators'; |
12 | 21 | import {CdkMenuGroup} from './menu-group'; |
13 | 22 | import {CDK_MENU} from './menu-interface'; |
@@ -38,6 +47,7 @@ import {CdkMenuBase} from './menu-base'; |
38 | 47 | ], |
39 | 48 | }) |
40 | 49 | export class CdkMenu extends CdkMenuBase implements AfterContentInit, OnDestroy { |
| 50 | + private readonly _elementRef: ElementRef<HTMLElement> = inject(ElementRef); |
41 | 51 | private _parentTrigger = inject(MENU_TRIGGER, {optional: true}); |
42 | 52 |
|
43 | 53 | /** Event emitted when the menu is closed. */ |
@@ -71,6 +81,14 @@ export class CdkMenu extends CdkMenuBase implements AfterContentInit, OnDestroy |
71 | 81 | */ |
72 | 82 | _handleKeyEvent(event: KeyboardEvent) { |
73 | 83 | const keyManager = this.keyManager; |
| 84 | + |
| 85 | + // Now that menu overlays can be inlined, need to verify triggering on own events. |
| 86 | + const element = this._elementRef.nativeElement; |
| 87 | + const target = _getEventTarget(event) as HTMLElement; |
| 88 | + if (target !== element && target.parentElement !== element) { |
| 89 | + return; |
| 90 | + } |
| 91 | + |
74 | 92 | switch (event.keyCode) { |
75 | 93 | case LEFT_ARROW: |
76 | 94 | case RIGHT_ARROW: |
|
0 commit comments