検索

ホームページ  >  に質問  >  本文

HTML を contenteditable に貼り付けるときに Chrome がフォント サイズを設定しないようにする

###再現:###

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粉398117857P粉398117857277日前459

全員に返信(2)返信します

  • P粉668113768

    P粉6681137682024-02-27 11:16:48

    貼り付けイベントをインターセプトし、貼り付けられたコンテンツを変更して、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('<', '<').replaceAll('>', '>') '

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

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

    返事
    0
  • P粉658954914

    P粉6589549142024-02-27 00:36:47

    を使用して 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();
    });
    };<', '<').replaceAll('>
    
    div[コンテンツ編集可能] { 境界線: 1 ピクセルの黒一色。 }
    ソーステキスト: 
    foobar
    宛先、
    ここに貼り付けてください:

    返事
    0
  • キャンセル返事