Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HTML Input - Undo history lost when setting input value programmatically

I have an HTML input. When a user types in it, I've set up the 'input' event to handle updating the input to a filtered version of what the user typed (as well as updating selectionStart and selectionEnd for smooth UX). This happens constantly in order to give the proper effect.

What I've noticed, however, is that whenever JS sets the value of an input via input.value = '...';, it appears the undo history for the input disappears. That is, pressing Ctrl-Z with it focused no longer steps back to the previous state.

Is there any way to either provide the input custom undo history, or otherwise prevent it from losing the history whilst still changing its value?


Here is a minimal example of my issue:
After typing in the top input (which rudimentarily adds periods between every character), Ctrl-Z does not undo.

<body>
    <input type="text" id="textbox" placeholder="No undo"/><br/>
    <input type="text" id="textbox2" placeholder="Undo"/>
    <script>
        var tbx = document.getElementById("textbox");
        tbx.addEventListener('input', () => {
            tbx.value = tbx.value + '.'
        });
    </script>
</body>
like image 495
Codesmith Avatar asked May 03 '26 07:05

Codesmith


1 Answers

"listen and reimplement ctrl+z" is a bad approach. there are other ways to trigger the built-in undo/redo in browser uis, which you can not intercept or reimplement, such as the context menu

the correct approach is to not change the value property, but use document.execCommand() with "insertText" or "delete" command as appropriate

like image 186
vvv Avatar answered May 05 '26 22:05

vvv