javascript - 可以在 javascript 中将剪贴板文本/html mimetype 复制到文本/纯文本吗?

标签 javascript clipboard

假设我有 text/html 是从复制到剪贴板事件(例如 document.execCommand)生成的。

有没有一种方法可以将该数据复制到 text/plain mimetype 而不会丢失 text/html 数据?如果是这样,如何做到这一点?请注意,我目前在复制剪贴板中有文本/html 数据,不能同时写入两者。

最佳答案

最好的可能是直接在复制时处理它。自 text/html应该只在从 Selection 而不是从输入复制时设置,我们可以通过 Range API 获取标记,并覆盖我们复制事件的数据。

addEventListener( "copy", (evt) => {
  const selection = getSelection();
  if( selection.isCollapsed ) return;
  evt.preventDefault();
  const range = selection.getRangeAt(0);
  const data_as_html = new XMLSerializer().serializeToString( range.cloneContents() );
  evt.clipboardData.setData("text/plain", data_as_html);
  evt.clipboardData.setData("text/html", data_as_html);
} );
<p>
  <span style="color:red;font-weight:bold">copy</span><span style="color:green;font-weight:thinner"> this</span>
  <span style="color:blue"> text</span>
</p>
<div contenteditable>Paste here as rich-text</div>
<textarea cols="30" rows="10">Paste here as markup</textarea>

现在OP当时说不能做了,不知道什么原因。 这意味着他们需要能够读取剪贴板的内容,为此,他们需要用户的批准,要么通过剪贴板 API 的权限,要么通过处理 "paste"。事件。

然而,除了plain/text,似乎没有浏览器真正支持读取任何其他内容。来自剪贴板 API,它只给我们留下了粘贴事件:

btn.onclick = (evt) => {
  addEventListener( "paste", (evt) => {
    const data_as_html = evt.clipboardData.getData("text/html");
    if( data_as_html ) {

    }
    addEventListener("copy", (evt) => {
      evt.preventDefault();
      evt.clipboardData.setData("text/plain", data_as_html);
      evt.clipboardData.setData("text/html", data_as_html);
    }, { once: true } );
    document.execCommand("copy");
  }, { once: true } );
  document.execCommand("paste");
}
<button id="btn">convert clipboard content to markup</button><br>
<p>
  <span style="color:red;font-weight:bold">copy</span><span style="color:green;font-weight:thinner"> this</span>
  <span style="color:blue"> text</span>
</p>
<div contenteditable>Paste here as rich-text</div>
<textarea cols="30" rows="10">Paste here as markup</textarea>

关于javascript - 可以在 javascript 中将剪贴板文本/html mimetype 复制到文本/纯文本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66237255/

相关文章:

c++ - Visual Studio 2013 C++ 监 window 口 : arrays copy incorrectly to clipboard

javascript - 使用 push() 添加新元素后,VueJS 检测 DOM 何时准备好

javascript - JS点击事件表示法

javascript - Ember 数据 JSON-RPC 请求示例

java - Mac OS X 上的剪贴板监控 | java

vim - 在插入模式下从系统剪贴板粘贴,然后重复 (.) 失败

javascript - 使用从下拉列表中选择的原因代码类型验证数字输入

javascript 在选项卡之间同步代码执行

java - 在Java中查找剪贴板图像的格式

java - 将 ListView 的一行复制到剪贴板中。 Java、SDK、安卓