如何检测哪个用户脚本管理器正在运行脚本

问题描述 投票:0回答:3

我正在编写的用户脚本中使用了一个函数,由于 Greasemonkey 的限制,该函数在 Greasemonkey 中不起作用。这个函数对于用户脚本的正确操作来说不是必需的,但它改善了用户体验,所以我不想完全删除它。

我尝试使用

try { ... } catch() { ... }
块,但不幸的是,Greasemonkey 在尝试执行函数时立即停止执行脚本,而不是抛出异常。因此,我决定在通过 Greasemonkey 加载脚本时阻止该函数的执行,但我一直找不到执行此操作的方法。

  • 我已通读 API 参考,但无法找到任何有用的内容。
  • 我发现这个 github 问题可以允许检测 Greasemonkey,但现在似乎已“修复”。
  • 我在 userscripts-mirror.org 上浏览了这个主题,但是该线程中建议的解决方案会检查 GM* 函数是否存在,这些函数在大多数其他用户脚本管理器中也可用(特别是 Tampermonkey 和 Violentmonkey,它们支持以下功能)油猴没有)。

如何检测活动用户脚本管理器是否是 Greasemonkey?

javascript greasemonkey userscripts
3个回答
2
投票

与列表中的第三项相同,您可以选择 Greasemonkey 不支持的功能,但支持您的功能的用户脚本管理器支持。

这个比较表我们可以看到Greasemonkey不支持@author元属性,但Tampermonkey和Violentmonkey支持。这意味着如果您设置 @author 元属性,您可以通过

GM_info.script.author
检查它是否存在。

// ==UserScript==
// @name         Greasemonkey Check
// @description  Checks if the script is loaded by Greasemonkey or not
// @author       @TinyGiant
// @grant        none
// ==/UserScript==

const isGM = 'undefined' === typeof GM_info.script.author;
console.log(`Is Greasemonkey? ${isGM}`);

1
投票

检查管理器正在运行的内容是一个糟糕的方法,这将被证明是脆弱的且维护成本高。 明智的做法是检查这个神秘功能是否存在,或者是否按需要工作。

这与“浏览器嗅探”是同一类型的问题,答案也相同:改用特征检测。
例如:

if (typeof dicyFunc == "function") {
    //-- Use the function
    dicyFunc ();
}
else {
    console.error ("This userscript engine does not support dicyFunc.");
}

更新用户评论: 有时您可能还需要一个 try...catch 块。例如:

try {
    REALLY_dicyFunc ();
}
catch (zError) {
    console.error ("REALLY_dicyFunc fail on this engine: ", zError);
}

您需要给出一个具体示例(制作 MCVE)以了解更多信息。


如果您坚持进行引擎检测,请参阅 这个答案,这是一个几乎重复的问题。 本质上,您将使用

GM_info.scriptHandler
属性,可能由
GM_info.version
属性支持。

为了获得最佳结果,向 Greasemonkey 提出功能请求以支持

scriptHandler
属性。 (Tampermonkey 和 ViolentMonkey 已经这样做了。) 最近关闭了 Greasemonkey 的拉取请求,所以也许它将出现在下一个版本中?


0
投票

Greasemonkey 引擎在 Sandbox
中运行您的代码 所以你的脚本不会直接注入到页面中!

如果您需要调用窗口定义的函数,
在脚本标题中使用 unwrapsandbox,在窗口范围内注入代码。


最好使用unsafeWindow,例如:

Win = typeof(unsafeWindow)=="undefined"? window: unsafeWindow;

alert( Win.location.href );
© www.soinside.com 2019 - 2024. All rights reserved.