If you are working with rich editors (like DraftJs) but have no access to their APIs (e.g. modifying from an extension), these are the solutions I've found:
- Dispatching a
beforeinput event, this is the recommended way, and most editors support
target.dispatchEvent(new InputEvent("beforeinput", { inputType: "insertText", data: text, bubbles: true, cancelable: true }))
- Dispatching a
paste event
const data = new DataTransfer(); data.setData( 'text/plain', text ); target.dispatchEvent(new ClipboardEvent("paste", { dataType: "text/plain", data: text, bubbles: true, clipboardData: data, cancelable: true }));
This last one uses 2 different methods:
If you want to replace all existing text, you have to select it first
function selectTargetText(target) { const selection = window.getSelection(); const range = document.createRange(); range.selectNodeContents(target); selection.removeAllRanges(); selection.addRange(range); } selectTargetText(target) // wait for selection before dispatching the `beforeinput` event document.addEventListener("selectionchange",()=>{ target.dispatchEvent(new InputEvent("beforeinput", { inputType: "insertText", data: text, bubbles: true, cancelable: true })) },{once: true})