我正在编写的用户脚本中使用了一个函数,由于 Greasemonkey 的限制,该函数在 Greasemonkey 中不起作用。这个函数对于用户脚本的正确操作来说不是必需的,但它改善了用户体验,所以我不想完全删除它。
我尝试使用
try { ... } catch() { ... }
块,但不幸的是,Greasemonkey 在尝试执行函数时立即停止执行脚本,而不是抛出异常。因此,我决定在通过 Greasemonkey 加载脚本时阻止该函数的执行,但我一直找不到执行此操作的方法。
如何检测活动用户脚本管理器是否是 Greasemonkey?
与列表中的第三项相同,您可以选择 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}`);
检查管理器正在运行的内容是一个糟糕的方法,这将被证明是脆弱的且维护成本高。 明智的做法是检查这个神秘功能是否存在,或者是否按需要工作。
这与“浏览器嗅探”是同一类型的问题,答案也相同:改用特征检测。
例如:
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
Greasemonkey 引擎在 Sandbox、
中运行您的代码
所以你的脚本不会直接注入到页面中!
如果您需要调用窗口定义的函数,
在脚本标题中使用 unwrap 和 sandbox,在窗口范围内注入代码。
最好使用unsafeWindow,例如:
Win = typeof(unsafeWindow)=="undefined"? window: unsafeWindow;
alert( Win.location.href );