HTML を contenteditable に貼り付けるときに Chrome がフォント サイズを設定しないようにする
P粉398117857
P粉398117857 2024-02-26 12:55:05
0
2
466
###再現:###

MVCE スニペットを Firefox デスクトップと Chrome デスクトップで実行します。
  1. FF デスクトップを開き、ソース コードから「foobar」をコピーします。
  2. Chrome デスクトップを開き、ターゲット (
  3. here:
  4. のコロンの後) に貼り付けます。
  5. リーリー リーリー リーリー
###あなたが気づくでしょう:###

クリップボード データには

<b>foobar</b>

(
    PASTE HTML:
  1. の後の内容を参照) が含まれていますが... 実際に貼り付けられた HTML では、b 要素に
  2. style="font-size: 14px;"
  3. が設定されています (14px サイズは contenteditable の親から取得されます)。 ソースのクリップボード データでフォント サイズが指定されていないため、貼り付けた HTML にフォント サイズを設定しないでください。

質問:

ソース HTML にフォント サイズがない場合に、貼り付けた HTML にフォント サイズを設定しないように Chrome に強制するにはどうすればよいですか?

回避策として、ソース上で font-size: unset/revert

を設定しましたが、その結果、貼り付けられた HTML の中央にも
font-size: unset

が表示されてしまいました。貼り付けた HTML にフォント サイズを表示したくないのです。 このコードのコンテキストは、ターゲットに貼り付けられるテキスト/HTML データを制御する Chrome 拡張機能です。ターゲットの contenteditable に貼り付けイベント リスナーをアタッチできますが、貼り付けた後にコンテンツの HTML/スタイルを変更することはできません。

P粉398117857
P粉398117857

全員に返信(2)
P粉668113768

貼り付けイベントをインターセプトし、貼り付けられたコンテンツを変更して、js を使用して強制的にプレーン テキストとして貼り付けるようにします。

contenteditable div に id="editor" の ID を追加しました。そして、次の js コードを追加します:

const editorEle = document.getElementById('editor');

// 貼り付けイベントを処理する
editorEle.addEventListener('paste', function (e) {
    // デフォルトのアクションを防止します
    e.preventDefault();

    // コピーしたテキストをクリップボードから取得します
    const text = e.clipboardData
        ? (e.originalEvent || e).clipboardData.getData('text/plain')
        : // IEの場合
        window.clipboardData
        ? window.clipboardData.getData('テキスト')
        : '';

    if (document.queryCommandSupported('insertText')) {
        document.execCommand('insertText', false, text);
    } それ以外 {
        // キャレットの現在の位置にテキストを挿入します
        const range = document.getSelection().getRangeAt(0);
        range.deleteContents();

        const textNode = document.createTextNode(text);
        range.insertNode(textNode);
        range.selectNodeContents(textNode);
        range.collapse(false);

        const 選択 = window.getSelection();
        選択.removeAllRanges();
        選択範囲.addRange(範囲);
    }
});

これは実行中のスニペットです。これで問題が解決したかどうかをお知らせください:

const editorEle = document.getElementById('editor');

// `paste` イベントを処理します
editorEle.addEventListener('paste', function (e) {
    // デフォルトのアクションを防止します
    e.preventDefault();

    // コピーしたテキストをクリップボードから取得します
    const text = e.clipboardData
        ? (e.originalEvent || e).clipboardData.getData('text/plain')
        : // IEの場合
        window.clipboardData
        ? window.clipboardData.getData('テキスト')
        : '';

    if (document.queryCommandSupported('insertText')) {
        document.execCommand('insertText', false, text);
    } それ以外 {
        // キャレットの現在の位置にテキストを挿入します
        const range = document.getSelection().getRangeAt(0);
        range.deleteContents();

        const textNode = document.createTextNode(text);
        range.insertNode(textNode);
        range.selectNodeContents(textNode);
        range.collapse(false);

        const 選択 = window.getSelection();
        選択.removeAllRanges();
        選択範囲.addRange(範囲);
    }
});




window.onload = function() {
  const info = document.querySelector('.info'),
    pinfo = document.querySelector('.paste-info'),
    ターゲット = document.querySelector('.target');
  setInterval(() => {
    const sel = ".source *, .target *"
    info.innerHTML = '';
    for (const elm of [...document.querySelectorAll(sel)]) {
      info.innerHTML = "TAG: " elm.tagName "; TEXT: " elm.innerText "; FONTSIZE: " window.getComputedStyle(elm)['font-size'] "
"; } }, 1000); target.addEventListener('paste', function(e) { pinfo.innerHTML = "HTML の貼り付け:
" e.clipboardData.getData('text/html').replaceAll('', '>') '

'; }); };
div[コンテンツ編集可能] {
  境界線: 1 ピクセルの黒一色。
}
ソーステキスト: foobar
宛先、

ここに貼り付けてください:

いいねを押す +0
P粉658954914

を使用して API を選択できます。
手順は

window.onload = function() { const info = document.querySelector('.info'), pinfo = document.querySelector('.paste-info'), ターゲット = document.querySelector('.target'); setInterval(() => { const sel = ".source *, .target *" info.innerHTML = ''; for (const elm of [...document.querySelectorAll(sel)]) { info.innerHTML = "TAG: " elm.tagName "; TEXT: " elm.innerText "; FONTSIZE: " window.getComputedStyle(elm)['font-size'] "

"; } }, 1000); target.addEventListener('paste', function(e) { pinfo.innerHTML = "HTML の貼り付け:
" e.clipboardData.getData('text/html').replaceAll('
', '>') '
';

e.preventDefault();
const tag = e.clipboardData.getData("text/html") ||
e.clipboardData.getData("テキスト/プレーンテキスト");
const sel = getSelection();
const range = sel.getRangeAt(0);
const frag = range.createContextualFragment(マークアップ);
スコープ.deleteContents();
range.insertNode(frag);
range.collapse();
});
};
div[コンテンツ編集可能] { 境界線: 1 ピクセルの黒一色。 }
ソーステキスト: 
foobar
宛先、
ここに貼り付けてください:

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート