Skip to content

Commit 791adef

Browse files
committed
Bind details and menu to event listeners
Removes null and type checking on event targets we know to be correct.
1 parent 7629135 commit 791adef

File tree

1 file changed

+30
-34
lines changed

1 file changed

+30
-34
lines changed

index.js

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,26 @@ class DetailsMenuElement extends HTMLElement {
3737
if (!summary.hasAttribute('role')) summary.setAttribute('role', 'button')
3838
}
3939

40-
details.addEventListener('click', shouldCommit)
41-
details.addEventListener('change', shouldCommit)
42-
details.addEventListener('keydown', keydown)
43-
details.addEventListener('toggle', loadFragment, {once: true})
44-
details.addEventListener('toggle', closeCurrentMenu)
45-
if (this.preload) {
46-
details.addEventListener('mouseover', loadFragment, {once: true})
40+
const subscriptions = [focusOnOpen(details)]
41+
const state = {
42+
details,
43+
subscriptions,
44+
loaded: false,
45+
shouldCommit: shouldCommit.bind(null, details, this),
46+
keydown: keydown.bind(null, details, this),
47+
loadFragment: loadFragment.bind(null, details, this),
48+
closeCurrentMenu: closeCurrentMenu.bind(null, details)
4749
}
50+
states.set(this, state)
4851

49-
const subscriptions = [focusOnOpen(details)]
50-
states.set(this, {details, subscriptions, loaded: false})
52+
details.addEventListener('click', state.shouldCommit)
53+
details.addEventListener('change', state.shouldCommit)
54+
details.addEventListener('keydown', state.keydown)
55+
details.addEventListener('toggle', state.loadFragment, {once: true})
56+
details.addEventListener('toggle', state.closeCurrentMenu)
57+
if (this.preload) {
58+
details.addEventListener('mouseover', state.loadFragment, {once: true})
59+
}
5160
}
5261

5362
disconnectedCallback() {
@@ -60,24 +69,18 @@ class DetailsMenuElement extends HTMLElement {
6069
for (const sub of subscriptions) {
6170
sub.unsubscribe()
6271
}
63-
details.removeEventListener('click', shouldCommit)
64-
details.removeEventListener('change', shouldCommit)
65-
details.removeEventListener('keydown', keydown)
66-
details.removeEventListener('toggle', loadFragment, {once: true})
67-
details.removeEventListener('toggle', closeCurrentMenu)
68-
details.removeEventListener('mouseover', loadFragment, {once: true})
72+
details.removeEventListener('click', state.shouldCommit)
73+
details.removeEventListener('change', state.shouldCommit)
74+
details.removeEventListener('keydown', state.keydown)
75+
details.removeEventListener('toggle', state.loadFragment, {once: true})
76+
details.removeEventListener('toggle', state.closeCurrentMenu)
77+
details.removeEventListener('mouseover', state.loadFragment, {once: true})
6978
}
7079
}
7180

7281
const states = new WeakMap()
7382

74-
function loadFragment(event: Event) {
75-
const details = event.currentTarget
76-
if (!(details instanceof Element)) return
77-
78-
const menu = details.querySelector('details-menu')
79-
if (!menu) return
80-
83+
function loadFragment(details: Element, menu: DetailsMenuElement) {
8184
const src = menu.getAttribute('src')
8285
if (!src) return
8386

@@ -117,14 +120,12 @@ function focusOnOpen(details: Element) {
117120
}
118121
}
119122

120-
function closeCurrentMenu(event: Event) {
121-
const el = event.currentTarget
122-
if (!(el instanceof Element)) return
123-
if (!el.hasAttribute('open')) return
123+
function closeCurrentMenu(details: Element) {
124+
if (!details.hasAttribute('open')) return
124125

125126
for (const menu of document.querySelectorAll('details[open] > details-menu')) {
126127
const opened = menu.closest('details')
127-
if (opened && opened !== el && !opened.contains(el)) {
128+
if (opened && opened !== details && !opened.contains(details)) {
128129
opened.removeAttribute('open')
129130
}
130131
}
@@ -163,13 +164,10 @@ function sibling(details: Element, next: boolean): ?HTMLElement {
163164

164165
const ctrlBindings = navigator.userAgent.match(/Macintosh/)
165166

166-
function shouldCommit(event: Event) {
167+
function shouldCommit(details: Element, menu: DetailsMenuElement, event: Event) {
167168
const target = event.target
168169
if (!(target instanceof Element)) return
169170

170-
const details = event.currentTarget
171-
if (!(details instanceof Element)) return
172-
173171
// Ignore clicks from nested details.
174172
if (target.closest('details') !== details) return
175173

@@ -219,9 +217,7 @@ function commit(selected: Element, details: Element) {
219217
)
220218
}
221219

222-
function keydown(event: KeyboardEvent) {
223-
const details = event.currentTarget
224-
if (!(details instanceof Element)) return
220+
function keydown(details: Element, menu: DetailsMenuElement, event: KeyboardEvent) {
225221
const isSummaryFocused = event.target instanceof Element && event.target.tagName === 'SUMMARY'
226222

227223
// Ignore key presses from nested details.

0 commit comments

Comments
 (0)