I want to create a text editor, but there are some confusing problems that have come up :
- The text formatting doesn't work unless text is selected first
- The color change on the buttons when the formatting is active sometimes works and sometimes doesn’t. I’ve tried three methods : wrapping it in a function didn’t work, adding an arrow function
() =>
in theonClick
makes the color appear active even before I click, and when I do click, it doesn’t change. Usingdocument.queryCommandState
directly without wrapping in a function didn’t work either.
And is using bind:innerHTML
as I did safe for security? If it’s not safe, what is the safe way?
<script> function formatText(command){ document.execCommand(command, false, null); } function isFormatActive(command){ return document.queryCommandState(command); }</script><div class="bg-black text-white font-lg font-bold"><button class:bg-emerald-950={isFormatActive("italic")} on:click={() => formatText("italic")} class="p-4"><i>I</i></button><button class:bg-emerald-950={() => isFormatActive('bold')} on:click={() => formatText('bold')} class="p-4"><b>B</b></button><button class:bg-emerald-950={document.queryCommandState('underline')} on:click={() => formatText('underline')} class="p-4"><u>U</u></button></div><div class="bg-emerald-500 text-white p-4 rounded-lg focus:border-none focus:outline-none" contenteditable="true">hello</div>