contenteditable divのキャレットにhtmlを挿入する
2023-07-29 07:53:17
質問
contenteditableが設定されたdivがあり、エンターキーが押されたときにjqueryを使ってpreventDefault()を呼び出し、キープレスをキャプチャしています。類似の この質問 と同様に、カーソルにテキストを挿入するために、私は直接HTMLを挿入したいのですが、簡潔にするために、それをbrタグと呼ぶことにします。上記の質問に対する回答を使用すると、range.pasteHTMLメソッドを使用するため、IEで実際に動作しますが、他のブラウザではbrタグはhtmlではなくプレーンテキストとして表示されます。どうすればテキストではなくhtmlを挿入するように答えを修正できますか?
どのように解決するのですか?
ほとんどのブラウザでは
insertNode()
メソッドを使用して、選択範囲から取得したRangeを表示します。IE < 9では
pasteHTML()
を使用することができます。以下は、すべての主要なブラウザでこれを行うための関数です。コンテンツがすでに選択されている場合は置き換えられるので、これは事実上ペースト操作となります。また、挿入されたコンテンツの終わりの後にキャレットを配置するコードを追加しました。
jsFiddle http://jsfiddle.net/jwvha/1/
コードです。
function pasteHtmlAtCaret(html) {
var sel, range;
if (window.getSelection) {
// IE9 and non-IE
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
// Range.createContextualFragment() would be useful here but is
// only relatively recently standardized and is not supported in
// some browsers (IE9, for one)
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
range.insertNode(frag);
// Preserve the selection
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}
} else if (document.selection && document.selection.type != "Control") {
// IE < 9
document.selection.createRange().pasteHTML(html);
}
}
2013年8月21日更新
コメントで要望があったように、挿入されたコンテンツを選択するかどうかを指定する追加パラメータを持つ、更新された例を示します。
デモです。 http://jsfiddle.net/timdown/jwvha/527/
コードです。
function pasteHtmlAtCaret(html, selectPastedContent) {
var sel, range;
if (window.getSelection) {
// IE9 and non-IE
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
// Range.createContextualFragment() would be useful here but is
// only relatively recently standardized and is not supported in
// some browsers (IE9, for one)
var el = document.createElement("div");
el.innerHTML = html;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
var firstNode = frag.firstChild;
range.insertNode(frag);
// Preserve the selection
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
if (selectPastedContent) {
range.setStartBefore(firstNode);
} else {
range.collapse(true);
}
sel.removeAllRanges();
sel.addRange(range);
}
}
} else if ( (sel = document.selection) && sel.type != "Control") {
// IE < 9
var originalRange = sel.createRange();
originalRange.collapse(true);
sel.createRange().pasteHTML(html);
if (selectPastedContent) {
range = sel.createRange();
range.setEndPoint("StartToStart", originalRange);
range.select();
}
}
}
関連
-
[解決済み] contenteditable変更イベント
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] HTMLマークアップのどこに<script>タグを記述すればよいですか?
-
[解決済み] jQueryイベントKeypress。どのキーが押されたか?
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] JavaScript で `throw` の後に `return` をする必要がありますか?
-
[解決済み] javascriptのキャンバスで画像をリサイズする (スムーズ)