diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2022-11-14 22:16:03 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2022-11-23 21:56:42 +0000 |
| commit | 8445f07827eb13db005aa38b7f665f8154e3918c (patch) | |
| tree | 595dd671ac5c05f6e5c86dece9b751bb9499b28a /emccpre.js | |
| parent | 52cd58043ac144eeafb92fd962662420506283c1 (diff) | |
| download | puzzles-8445f07827eb13db005aa38b7f665f8154e3918c.zip puzzles-8445f07827eb13db005aa38b7f665f8154e3918c.tar.gz puzzles-8445f07827eb13db005aa38b7f665f8154e3918c.tar.bz2 puzzles-8445f07827eb13db005aa38b7f665f8154e3918c.tar.xz | |
js: Replace :focus-within with JS-maintained .focus-within
Old browsers (like KaiOS 2.5) don't have :focus-within, but it's pretty
easy to replace the pseudo-class with a real .focus-within class
maintained by JavaScript event handlers. This is made only marginally
fiddlier by the odd fact that "focus" and "blur" events don't bubble.
Diffstat (limited to 'emccpre.js')
| -rw-r--r-- | emccpre.js | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -525,6 +525,25 @@ function initPuzzle() { command(4); }); + // Event handlers to fake :focus-within on browsers too old for + // it (like KaiOS 2.5). Browsers without :focus-within are also + // too old for focusin/out events, so we have to use focus and + // which don't bubble but can be captured. + menuform.addEventListener("focus", function(event) { + var elem = event.target; + while (elem && elem !== menuform) { + elem.classList.add("focus-within"); + elem = elem.parentElement; + } + }, true); + menuform.addEventListener("blur", function(event) { + var elem = event.target; + while (elem && !elem.contains(event.relatedTarget)) { + elem.classList.remove("focus-within"); + elem = elem.parentElement; + } + }, true); + // Set up the function pointers we haven't already grabbed. dlg_return_sval = Module.cwrap('dlg_return_sval', 'void', ['number','string']); |