去除外部格式,但在元素输入时保留缩进和回车符<pre>



我正在使用以下内容:

<style>
pre {
outline:none;
font-family : monospace;
white-space : pre;
background-color : rgb(19, 22, 27);
color            : #98d8e7;    
}
</style>
<body>  
<pre contenteditible="true"></pre>
</body>

在Chrome中,我可以选择";粘贴";(不希望的结果(或";粘贴并匹配样式";(期望的结果(,但仅在其他浏览器中";粘贴";提供。

一个常规的";粘贴";保留我不想要的原始内容格式,如文本颜色和背景颜色。这为我的用例创建了一个不希望的结果。

我想做的是始终强制粘贴以匹配<pre>元素的样式。

我的一个想法是截取粘贴的文本,将其传递给一个不可见的textarea元素,然后获得该值。但这似乎是一项额外的工作,(至少在我看来(应该非常简单。但我不确定如何完成。

我对javascript或css解决方案持开放态度。任何事,真的。

如果我在这里说明了显而易见的问题,我很抱歉——我知道这并不能完全解决你的问题——但你可以对粘贴事件做一些事情,将粘贴事件的数据作为文本获取,并将元素的innerHTML设置为该文本。

这种方法可能无法按照您的意愿保留空白。下面的骨架实现替换了整个元素的内容,但如果您采用以下方法,您可以使用getSelection来解决这个问题:

function onPaste (e) {
e.preventDefault(); // stop the paste
const t = e.clipboardData.getData("text"); // grab the pasted content as plain text
e.target.innerHTML = t; // set the element's innerHTML to the plain text
}
const p = document.getElementById('test');
p.addEventListener('paste', onPaste);
pre {
min-height: 200px;
outline: none;
font-family: monospace;
white-space: pre;
background-color: rgb(19, 22, 27);
color: #98d8e7;
}
<pre id="test" contenteditable></pre>

另一种类似的可能性是让粘贴通过,然后立即获取元素的内容并去掉所有格式。这似乎是一种更令人生畏的方法,但它会让你有能力进行更多的手术清理。

function onPaste (e) {
// setTimeout to wait for the paste to complete
setTimeout(() => {
// do something with p.innerHTML or p.innerText;
console.log(e.target.innerHTML);
}, 0);
}

最新更新