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

3

我正在编写用户脚本,其中使用的一个函数在Greasemonkey中无法正常工作,因为Greasemonkey有其限制。该函数对于用户脚本的正常操作并不是必需的,但它可以提高用户体验,所以我不想完全删除它。

我尝试使用try {...} catch() {...}块,但不幸的是,当它尝试执行该函数时,Greasemonkey会立即停止执行脚本,而不是抛出异常。所以我决定在通过Greasemonkey加载脚本时阻止执行该函数,但我一直找不到这样做的方法。

我该如何检测当前活动的用户脚本管理器是否为Greasemonkey?


1
您可以通过排除法进行检查,例如 @grant GM_addValueChangeListener,然后 if (typeof GM_addValueChangeListener === 'undefined') ... 就意味着它不是 Tampermonkey。接下来检查一些在 Violentmonkey 中支持但在 GM 中不支持的内容。 - wOxxOm
1
你所说的具体功能是什么?也许直接检查它是否有效会更明智,而不是检查你在哪个用户脚本管理器中。 - Tomáš Zato
1
@TomášZato我确实尝试过那个方法,但不幸的是没有任何异常被抛出,但当它执行该函数时,Greasemonkey停止了脚本的执行。从“如何”风格的问题到一个过于具体的调试风格的问题(即“这个MCVE在Greasemonkey中不起作用”)的现实变化对于未来的读者来说并不有用,而且特定的函数与此问题无关。由于这个问题代表了一个清晰和合理范围的有效编程任务,我认为它应该被允许保持原样。 - Random Logic
1
我只是想要澄清,我并不希望您改变问题的范围。 - Tomáš Zato
1
我明白,这种情况也发生在我身上,对于在SO上来说非常令人沮丧。 - Tomáš Zato
显示剩余3条评论
2个回答

2
与您列表中的第三项类似,您可以选择一个Greasemonkey不支持但被支持您所使用的用户脚本管理器的函数。从这个比较表可以看到,@author元属性不被Greasemonkey支持,但是被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属性支持。
为了获得最佳结果,请提出一个功能请求,以支持scriptHandler属性的Greasemonkey。(Tampermonkey和ViolentMonkey已经支持了。)有一个最近关闭的拉取请求用于Greasemonkey,所以也许它会在下一个版本中?

注意:我没有对这个答案进行负评(它提供了一个合理的解决方案)。 - Random Logic
1
我甚至没有意识到 GM_info.scriptHandler 是一个东西。@RandomLogic 我可能会使用它,而不是依赖于Greasemonkey不支持 @author,因为这可能会在未来发生改变。 - user4639281
@Brock 它报告说它是一个函数,但当执行该函数时,脚本仍然停止执行。 - Random Logic
那么,你需要一个MCVE(最小可复现示例)...(也许还需要一个try..catch块)。 - Brock Adams
这不是一个调试风格的问题,我不想把它变成一个调试风格的问题,也不想再花时间去解决它。我只想确定哪个用户脚本管理器正在运行该脚本,你建议使用 GM_info.scriptHandler 是我问题的完美答案。出于这个原因,我接受了你的答案,但我觉得你坚持让我不要做我要做的事情,当这是一个完全合理的任务时,会减弱你的答案。 - Random Logic
显示剩余6条评论

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