forked from cybrespace/pinafore
50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
// Delegate certain events to the global document for perf purposes.
|
|
|
|
import { mark, stop } from './marks'
|
|
|
|
const callbacks = {}
|
|
|
|
if (process.browser && process.env.NODE_ENV !== 'production') {
|
|
window.delegateCallbacks = callbacks
|
|
}
|
|
|
|
function onEvent(e) {
|
|
let { type, keyCode, target } = e
|
|
if (!(type === 'click' || (type === 'keydown' && keyCode === 13))) {
|
|
// we're not interested in any non-click or non-Enter events
|
|
return
|
|
}
|
|
mark('delegate onEvent')
|
|
let attr = `delegate-${type}-key`
|
|
let key
|
|
let element = target
|
|
while (element) {
|
|
if ((key = element.getAttribute(attr))) {
|
|
break
|
|
}
|
|
element = element.parentElement
|
|
}
|
|
if (key && callbacks[type] && callbacks[type][key]) {
|
|
callbacks[type][key](e)
|
|
}
|
|
stop('delegate onEvent')
|
|
}
|
|
|
|
export function registerDelegate(type, key, callback) {
|
|
mark('delegate registerDelegate')
|
|
callbacks[type] = callbacks[type] || {}
|
|
callbacks[type][key] = callback
|
|
stop('delegate registerDelegate')
|
|
}
|
|
|
|
export function unregisterDelegate(type, key) {
|
|
mark('delegate unregisterDelegate')
|
|
callbacks[type] = callbacks[type] || {}
|
|
delete callbacks[type][key]
|
|
stop('delegate unregisterDelegate')
|
|
}
|
|
|
|
if (process.browser) {
|
|
document.addEventListener('click', onEvent)
|
|
document.addEventListener('keydown', onEvent)
|
|
} |