Javascript: 使用Tampermonkey将选定内容复制到剪贴板

3
这段代码(由this page提供)在普通的HTML文件中使用时能够很好地完成其工作。特别是,它可以成功地将所选文本复制到剪贴板中。
function copySelectionText(){
  var copysuccess
  try {
    copysuccess = document.execCommand("copy")
  } catch(e) {
    console.log(e)
    copysuccess = false
  }
  return copysuccess
}
document.addEventListener('mouseup', function(){
  var copysuccess = copySelectionText()
}, false)

然而,当我在Tampermonkey自定义脚本中使用它时,它无法正常工作:

(function() {
    // 'use strict';
    // Your code here...

})();

免责声明:

  • 这是我第一次编写tampermonkey脚本。
  • 我打算在一个朋友拥有的特定网站上使用它,而不是滥用在其他任何网站上。
  • 使用原生JavaScript(无库)将是一个重大优势。

问题:如何使此函数在tampermonkey自定义脚本中工作?

我按照tampermonkey/greasemonkey文档中的说明进行了操作。

控制台显示“copysuccess未定义”。console.log(e)也没有产生任何结果。


在这种情况下,帮助你非常困难。我建议你先进行一些调试,以便我们确切地知道错误在哪里。你可以使用try catch,但不要记录它捕获的错误。这将是一个很好的开始。此外,只需添加console.log()到每个阶段,也许事件监听器甚至没有触发。将调试详细信息放入问题中,您将更快地得到答案 :) - Wimanicesir
2个回答

0

我相信您可能未通过严格性检查。由于您正在使用'use strict',因此您的JavaScript需要符合规范。有关严格模式的更多信息,请参见:MDN: Strict mode

另外,除了存储copy命令的成功性之外,您并没有执行任何操作。您既没有记录,也没有警报任何内容。而要获取实际的剪贴板文本,您需要访问剪贴板对象。

以下脚本适用于Violentmonkey。它使用新的异步剪贴板API。

// ==UserScript==
// @name         Copy Selected Text
// @namespace    Stack Overflow
// @match        https://dev59.com/qdiHpIgBRmDukGFEOoR6
// @grant        none
// @version      1.0.0
// @author       Mr. Polywhirl
// @description  Userscript for copying text on a website.
// ==/UserScript==
(function() {
  // 'use strict';
  function copySelectionText() {
    let copysuccess;
    try {
      copysuccess = document.execCommand("copy");
    } catch(e) {
      console.log(e);
      copysuccess = false;
    }
    return copysuccess;
  }

  async function onMouseUp() {
    const copysuccess = copySelectionText();
    if (copysuccess) {
      // See: https://dev59.com/rGw15IYBdhLWcg3wxuch#49886460
      const clipboardText = await navigator.clipboard.readText();
      alert(clipboardText);
    }
  }

  document.addEventListener('mouseup', onMouseUp, false);
})();

感谢您对问题的非常具体的解决方法。我还从您的答案中发现了原始代码中的一个简单但重大缺陷,它可以在不进行修改的情况下工作,只需在//@match中指定除https://*之外的其他值即可。 - JitteryNutmeg
@JitteryNutmeg 尽管实际的复制机制仍然有效,但你链接的文章最后更新于2015年。我建议使用近1-2年内撰写的文章。此外,请查看Greasemonkey手册。它可以让你了解用户脚本的结构。另外,还有一个GM.grantClipboard函数可能会引起你的兴趣。 - Mr. Polywhirl

0

我认为它不触发的原因是脚本没有完成加载页面就被触发了,所以最简单的方法是添加一个setTimeOut()函数,在触发之前延迟几秒钟。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接