重現:
here:
中的冒號後面)
window.onload = function() { const info = document.querySelector('.info'), pinfo = document.querySelector('.paste-info'), target = 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'] + "<br>"; } }, 1000); target.addEventListener('paste', function(e) { pinfo.innerHTML += "PASTE HTML: <pre>" + e.clipboardData.getData('text/html').replaceAll('<', '<').replaceAll('>', '>') + '</pre><br>'; }); };
div[contenteditable] { border: 1px solid black; }
<div class="source" contenteditable=true>Source text: <b>foobar</b></div> <div style="font-size: 14px"> <div contenteditable=true class="target">Destination, <h1>paste here:</h1></div> </div> <div class="info"></div> <div class="paste-info"></div>
您會注意到:
<b>foobar</b>
(請參閱 PASTE HTML:
之後的內容),但是...b
元素上設定了 style="font-size: 14px;"
(14px 大小來自 contenteditable 的父級)。 我希望貼上的 HTML 上沒有設定任何字體大小,因為它們沒有在來源剪貼簿資料中指定。
問題:當來源 HTML 上沒有字體大小時,如何強制 Chrome 不在貼上的 HTML 上放置任何字體大小?
我嘗試了一種解決方法:在來源上設定font-size: unset/revert
,但這會導致font-size: unset
也出現在貼上的HTML中。我不想在貼上的 HTML 中出現任何字體大小。
此程式碼的上下文是 Chrome 擴展,我控制貼在目標中的文字/html 資料。我可以在目標 contenteditable 上附加貼上事件偵聽器,但在貼上內容後我無法更改內容的 HTML/樣式。
也許可以攔截貼上事件,並更改貼上的內容以強制使用js將其貼上為純文字。
我在
contenteditable
div 上新增了id="editor"
的 id。並加入以下js程式碼:這是它運作的一個片段。讓我知道這是否解決了您的問題:
您可以使用 選擇API。
步驟是
Range
物件。Range
物件將貼上的 HTML 標記解析為DocumentFragment
對象,這要歸功於createContextualFragment()
#方法。Range#deleteContents()
#).DocumentFragment
物件第2步,遊標所在位置。Range
對象,以便遊標移至新貼上內容的末端。手動執行所有這些步驟將阻止瀏覽器「智慧」處理富文本內容;僅解析剪貼簿中的內容。