GM_setClipboard(以及其他GM函数)在Firefox中会出现错误,但在Chrome / Tampermonkey中不会?

10

我正在使用Firefox,并尝试创建一个函数,当我按下Shift+*(小键盘)时,它将复制链接的文本。

这段代码通常在Chrome Tampermonkey中运行正常,但由于某种原因在Firefox中没有任何反应。
控制台显示以下错误信息:

"ReferenceError: GM_setClipboard is not defined"

这是我的代码:

document.addEventListener( "keydown", function(i) {
    var selectLink = $('a').eq(8); // The link by index
    var targetLink = selectLink.text(); // The link text

    if (i.keyCode === 106 && i.shiftKey) // Shift+Num*
    {
        GM_setClipboard(targetLink); // Copy to clipboard
    }
});

有任何错误消息或类似的内容吗?实际和期望的行为是什么? - Martin Zabel
是的,抱歉我刚刚找到了如何在控制台中检索Greasemonkey错误消息的方法。错误是“ReferenceError: GM_setClipboard未定义”。预期行为是当我按Shift + *时,它将复制所选链接的文本。 - DjH
2个回答

16

Greasemonkey需要显式声明@grant语句来使用GM_函数。而Tampermonkey仍然进行一些自动检测(这可能存在安全隐患)。

所以:

  1. 您需要在元数据块中指定// @grant GM_setClipboard

  2. 但是,这会重新启用沙盒(一个好事情),因此您还需要确保已经@require了jQuery。

这个脚本将在Greasemonkey和Tampermonkey中都起作用:

// ==UserScript==
// @name     _YOUR_SCRIPT_NAME
// @match    http://YOUR_SERVER.COM/YOUR_PATH/*
// @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @grant    GM.setClipboard
// ==/UserScript==

document.addEventListener ( "keydown", function (i) {
    var selectLink = $('a').eq (8); // The link by index
    var targetLink = selectLink.text ().trim (); // The link text

    if (i.keyCode === 106  &&  i.shiftKey) // Shift+Num*
    {
        GM.setClipboard (targetLink); // Copy to clipboard
    }
} );

4
现在应该使用GM.setClipboard(注意是.而不是_)。仍然需要添加@grant声明,也需要进行更正。在Firefox 68.3(2019年12月发布)和Grease Monkey 4.9中进行了测试。 - Gabriel Devillers

1

https://clipboardjs.com/ 是一个不错的选择。

一个比较常见的使用场景是从另一个元素复制内容。您可以通过在触发元素中添加 data-clipboard-target 属性来实现这一点。

enter image description here


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