Javascript 如何检测哪个userscript manager正在运行脚本

Javascript 如何检测哪个userscript manager正在运行脚本,javascript,greasemonkey,userscripts,Javascript,Greasemonkey,Userscripts,我正在编写的用户脚本中使用一个函数,由于Greasemonkey的限制,该函数在Greasemonkey中不起作用。这个函数对于用户脚本的正确操作不是必需的,但它改善了用户体验,所以我不想完全删除它 我尝试使用try{…}catch(){…}块,但不幸的是,Greasemonkey在尝试执行函数时立即停止脚本的执行,而不是抛出异常。因此,我决定在通过Greasemonkey加载脚本时阻止函数的执行,但我一直找不到这样做的方法 我通读了一遍,但找不到任何有用的东西 我发现了,但现在似乎已经“修复

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

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

  • 我通读了一遍,但找不到任何有用的东西
  • 我发现了,但现在似乎已经“修复”了
  • 我看了一遍,但是线程中建议的解决方案检查GM*函数的存在,这在大多数其他用户脚本管理器中也可用(特别是Tampermonkey和Violentmonkey,它们支持Greasemonkey不支持的函数)

如何检测活动的userscript管理器是否为Greasemonkey?

与列表中的第三项相同,您可以选择Greasemonkey不支持的函数,但支持您的函数的userscript管理器支持该函数

从中可以看出,@author元属性不受Greasemonkey支持,但受Tampermonkey和Violentmonkey支持。这意味着,如果设置@author元属性,可以通过
GM_info.script.author
检查该属性是否存在

/==UserScript==
//@name Greasemonkey Check
//@description检查脚本是否由Greasemonkey加载
//@author@TinyGiant
//@grant none
//==/UserScript==
const isGM='undefined'==typeof GM_info.script.author;
log(`Is Greasemonkey?${isGM}`);

检查manager正在运行的是一种糟糕的方法,这将被证明是脆弱和高维护的明智的做法是检查这个神秘的功能是否存在,或者根据需要工作。

这与“浏览器嗅探”问题类型相同,答案相同:
例如:

if(dicyFunc的类型==“函数”){
//--使用函数
dicyFunc();
}
否则{
console.error(“此userscript引擎不支持dicyFunc”);
}
用户评论更新: 有时候你可能也需要尝试一下。。。挡块。例如:

try {
    REALLY_dicyFunc ();
}
catch (zError) {
    console.error ("REALLY_dicyFunc fail on this engine: ", zError);
}
你需要给出一个具体的例子(做一个MCVE)来了解更多


如果你坚持要检测引擎,那就考虑一个近乎重复的问题。 基本上,您将使用
GM_info.scriptHandler
属性,可能由
GM_info.version
属性备份

为了获得最佳效果,请对Greasemonkey发出功能请求,以支持
scriptHandler
属性。(猴子和紫罗兰猴子已经做了。)
有,所以可能会出现在下一个版本中?

您可以通过排除进行检查,例如,
@grant GM_addValueChangeListener
,然后
如果(GM_addValueChangeListener的类型==='undefined')…
意味着它不是被篡改的。下一步检查Violentmonkey支持但GM不支持的功能。您所说的具体功能是什么?也许更明智的做法是简单地检查它是否有效,而不是检查您使用的是哪个用户脚本管理器。@TomášZato我确实尝试过,不幸的是没有抛出异常,但Greasemonkey在执行函数时停止执行脚本。现实地将其从“如何”风格的问题改为过于具体的调试风格的问题(即“此MCVE在Greasemonkey中不起作用”)对未来的读者不会有用,具体功能与此问题无关。由于这个问题代表了一个有效的编程任务,并且范围明确合理,我觉得应该允许它保持原样。我只是要求澄清,我不想你改变问题的范围。我理解,这也发生在我身上,在这里非常令人沮丧。谢谢你的回答
gmu info.scriptHandler
是个好主意。有关为什么检查函数是否工作不是可行的解决方案(Greasemonkey在看到函数后立即停止执行)以及为什么我认为不需要MCVE来回答此问题和主题的更多信息,请参阅至。我特别想寻找一种方法来检测哪个userscript manager正在运行脚本,所以我想保留这个问题。注意:我没有否决这个答案(它确实提供了一个合理的解决方案)。我甚至没有意识到
gmu info.scriptHandler
是一件事@RandomLogic我可能会使用它,而不是依赖Greasemonkey不支持
@author
,因为这在将来可能会改变。@RandomLogic,检查函数始终是一个可行的解决方案。查看更新的答案。@Brock它报告,因为它是一个函数,所以在执行函数时脚本仍然停止执行。