Upgrade to Pro — share decks privately, control downloads, hide ads and more …

contenteditable と日本語入力に向き合う

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →
Avatar for taki taki
October 07, 2026

contenteditable と日本語入力に向き合う

エディタフレームワーク(ProseMirror / Lexical など)を使わずに、
contenteditable で WYSIWYG エディタを作ったときの話です。

DOM から値を取り出そうとして span・br・div に追われ、Enter を止めたら IME の変換確定まで止めてしまい、isComposing で分けました。その後に contenteditable="plaintext-only" というすばらしい値を知りました。

フロントエンドカンファレンス東京 × Vue Fes Japan × JSConf JP コラボイベント(2026-10-07)

Avatar for taki

taki

October 07, 2026

More Decks by taki

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 ロリポップ‧ムームードメイン事業部 taki 2025年 新卒⼊社 猫と星とお絵描きが好きなエンジニア 『LOLIPOP! AIホームページ』の開発をしています - Twitter

    : @taki73_cat - アイコンは『ジト⽬猫のハル』 グッズ作ったりイベント出展したりしています - 創作活動は良いぞ! 2
  2. 今回の題材 WYSIWYG エディタの実装 - What You See Is What You

    Get(⾒たままが得られる) - テキストを⾒た⽬そのままでその場で編集したい 5
  3. 何を使えばできるか 主な選択肢は2つ 例:<h1>かんばん猫</h1> を編集可能にしたい <input> / <textarea> - h1 のまま編集可能に

    できない <h1>かんばん猫</h1> <input value="かんばん猫"> contenteditable - h1 のまま編集可能に できる <h1 contenteditable>かんばん猫</h1> 6
  4. ⼀般的に取られる⼿法 エディタフレームワークを使う ブラウザが作る DOM と、本来欲しい値の差を埋める 1. 内部モデルを本来の値として持つ 2. DOM の変更を観測して内部モデルと⽐較する

    3. ⾃分が出していない変更を戻す ProseMirror / Lexical / Tiptap / Slate など note は ProseMirror を使っている 『noteのエディタを新バージョンに完全移⾏しました』2023-01-19 8
  5. Enterは改⾏だけじゃない 変換確定の Enter まで⽌めてしまった 「ねこ」→「猫」の変換を確定する Enter これも e.key === “Enter”

    なので改⾏が⼊ってしまう... こんなエディタ いかがですか? ※gif動画 変換と同時に改⾏もされてしまう様⼦ 12
  6. 解決策 - あとから分かったこと もっと適切な⽅法があった contenteditable = “plaintext-only” - 書式が⼊らない(<span> も

    <b> も) - ペーストもプレーンテキストになる - 改⾏は <div> ではなく \n で⼊る → 今⽇話した改⾏まわりは、これで書かずに済む 14