前提・実現したいこと
ブラウザベースでのWYSIWYGエディタをJavaScript で開発中です。オープンソースのWYSIWYGエディタも試してみましたが、DBやS3へのデータ格納の為の改造が必要であまり省力化にならないため、自作で機能を絞って実装する方向に舵を切っています。
以下の操作でリンク挿入できる機能を開発しています。
- contenteditableのエディタ領域上でリンクで囲みたい文字列を選択
- エディタ領域外に配置したリンク挿入ボタンをクリック
- モーダルがポップアップし、URL入力フィールドにURLを入力し、挿入ボタンをクリック
- contenteditableのエディタ領域上の囲んだ文字列がリンクで囲まれた状態になる
発生している問題・エラーメッセージ
困っているのは、3でURLを入力するとgetSelentionで選択されているのがモーダルになってしまい、4でのリンク挿入が行われません。その後もう一度リンク挿入ボタンをクリックして、モーダルのURLを変更せずに挿入ボタンをクリックすると、リンクの挿入はうまくいきます。
このため2の操作で選択範囲自体を保存し、4の操作の前に再度同じ範囲が選択された状態にしてから、リンクで囲むようにしたいと思っています。
このような実装を行いたい場合、どのメソッドなどを使えばよいかご教示いただけますか?
調べてはみたのですが、当てはまるようなサンプルが見当たらず困っております。
もちろん、上記手順での操作が可能であれば、別のアプローチでのアドバイスも頂けると大変ありがたいです。
該当のソースコード
3で挿入ボタンをクリックすると呼ばれる処理が以下になります。
javascript
1function add_link(){ 2var link_url = document.getElementById('textarea_link_url').value; 3 4var sel = window.getSelection(); 5var range = sel.getRangeAt(0); 6var newNode = document.createElement('a'); 7newNode.href=link_url; 8var dom=range.cloneContents(); 9newNode.appendChild(dom); 10range.deleteContents(); 11range.insertNode(newNode); 12 13sel.removeAllRanges(); 14}
試したこと
getSelectionの返り値を格納するselや、getRangeAt(0)の返り値を格納するrangeについては、別のグローバル変数に格納して試してみましたが、モーダル上でURLを入力すると別の変数になっているはずが、その変数側もモーダル自体が選択された状態に中身が変わってしまいました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/21 06:59