- From: Daniel Bates <notifications@github.com>
- Date: Mon, 08 Jul 2019 11:59:52 -0700
- To: w3c/uievents <uievents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/uievents/issues/238@github.com>
Create a page with the following markup: ``` <!DOCTYPE html> <html> <body> <p>Focus the text field below. Then press a key on the keyboard. The output will be the value of the field seen one event loop turn after the listed event dispatched.</p> <input id="input"> <pre id="console"></pre> <script> // Note that scheduling a timer from an Input event handler is for aesthetics only: to make the // logged Input event be ordered like the spec'ed DOM dispatch event order. By the time the Input // event fires the DOM is guaranteed to have been updated. So, no timer is needed. let input = document.getElementById("input"); for (let eventName of ["keydown", "keypress", "keyup", "input"]) { input.addEventListener(eventName, (event) => { window.setTimeout(() => { log(`${eventName}: ${input.value}`); }, 0); }); } function log(message) { document.getElementById("console").appendChild(document.createTextNode(message + "\n")); } </script> </body> </html> ``` Open ^^^ in your browser and follow the instructions. I'm seeing different things in different browsers™. In Mac Firefox 67.0.4 I see, emphasis mine: <pre> <b>keydown: </b> keypress: a input: a keyup: a </pre> On iOS, I see the following (with auto capitalization is off under Settings > General > Keyboard > Hardware Keyboard), emphasis mine: <pre> <b>keydown: </b> <b>keypress: </b> input: a keyup: a </pre> In Mac Safari and Chrome Canary for Mac version 77.0.3847.0, emphasis mine: <pre> <b>keydown: a</b> <b>keypress: a</b> input: a keyup: a </pre> For the last two browsers above what is happening is that text insertion (i.e. a DOM update) is occurring within the same event loop as the the keydown. Spec makes **no** mention that DOM update must occur in same event loop as keydown or keypress (that's what Firefox is doing). Spec **only** guarantees DOM is updated when input event is dispatched. ## Real-world examples I know of two sites that assume DOM is updated on keydown/keypress: 1. Google Sheets Repro steps: Create a new sheet. Tap on a cell. Type into it. Formula bar is updated with DOM value of cell on timer scheduled from keypress (read: not input event). 2. Bitbucket Server (formerly known as Stash) Repro steps: In a pull request comment, type `@`. Bitbucket schedules a timer on keypress and expects text insertion (i.e DOM update) when timer fires so that when it reads `<textarea>'s` value it will see the typed `@` and trigger its suggestion UI. ## What to do? **What is the expected behavior?** **Should spec require DOM be updated for text insertion/deletion in same event loop iteration that keydown is dispatched?** same event loop iteration that keypress is dispatched? Should we keep the current spec text with no such requirement? Should we spec out explicitly that there is no such requirement? -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/w3c/uievents/issues/238
Received on Monday, 8 July 2019 19:00:14 UTC