UNPKG

@muban/muban

Version:

Writing components for server-rendered HTML

26 lines (25 loc) 915 B
import { unref, watchEffect } from '@vue/runtime-core'; export function hasFocusBinding(target, valueAccessor) { const unwatch = watchEffect(() => { const focusValue = unref(valueAccessor); if (focusValue) { if (document.activeElement !== target) { target.focus(); } } else if (document.activeElement === target) { target.blur(); } }); function onFocusChange() { valueAccessor.value = document.activeElement === target; } // Nice: https://hiddedevries.nl/en/blog/2019-01-30-console-logging-the-focused-element-as-it-changes target.addEventListener('focus', onFocusChange); target.addEventListener('blur', onFocusChange); return () => { unwatch(); target.removeEventListener('focus', onFocusChange); target.removeEventListener('blur', onFocusChange); }; }