Thanks to visit codestin.com
Credit goes to github.com

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)