该候选人是以前的GM版本。问题很可能出现在用户脚本可以运行的不同范围内,如here所述。但是,正如here所述,此功能目前尚未针对Greasemonkey 4.0进行记录。
我有这个Greasemonkey演示脚本:
// ==UserScript==
// @name GM_getValue, GM_setValue don't work demo
// @version 0.2
// @author You
// @include /^https:\/\/stackoverflow.com/$/
// @grant GM_getValue
// @grant GM_setValue
// @run-at document-end
// ==/UserScript==
console.log('script started');
var id = GM_getValue('testName', 0);
console.log('got ' + id);
id++;
GM_setValue('testName', id);
使用https://stackoverflow.com/调用它,可以很好地看到它被调用。
但是,我在控制台上收到此错误:
Script error:
ReferenceError: GM_getValue is not defined
Stack trace:
userScript@user-script:demosrv/GM_getValue%2C%20GM_setValue%20don%27t%20work%20demo:372:5
scopeWrapper@user-script:demosrv/GM_getValue%2C%20GM_setValue%20don%27t%20work%20demo:381:9
@user-script:demosrv/GM_getValue%2C%20GM_setValue%20don%27t%20work%20demo:361:17
我已经挖掘了很多文档,但似乎GM_{get,set}Value
根本就不想存在。
为什么会这样?如何使它工作?
我正在使用Firefox。
答案 0 :(得分:10)
GM_getValue
和GM_setValue
现在在GreaseMonkey中已过时。正确的方法是GM.setValue
和GM.getValue
。
GreaseMonkey文档经常使用旧的API调用名称,这是一个连续的错误。可能它没有正确更新。
正如文档here所说,GM功能可以在不同的范围内运行。不幸的是,直到现在我还没有找到任何信息,哪些范围存在,我们如何在它们之间切换。
网上的旧引用,使用GM_getValue
都已过时了。
重要的事情:
GM_getValue
是具有返回值的函数,但GM.getValue
和GM.setValue
返回Promise
s。await
调用几乎与旧的,漂亮版本中使用的一样使用它们。远程链接上的此示例有效:
// ==UserScript==
// @name Greasemonkey set-and-get Example
// @description Stores and logs a counter of executions.
// @grant GM.setValue
// @grant GM.getValue
// ==/UserScript==
(async () => {
let count_before = await GM.getValue('count', 0);
// Note awaiting the set -- required so the next get sees this set.
await GM.setValue('count', count_before + 1);
// Get the value again, just to demonstrate order-of-operations.
let count_after = await GM.getValue('count');
console.log('Greasemonkey set-and-get Example has run', count_after, 'times');
})();
但是,关于范围以及我们如何与它们进行交互仍然没有更清晰的文档。
看来,至少有两个范围:
GM.*
API。GM.*
API(因此,您可以创建脚本本地持久存储),但无法访问DOM。因此,为4.0开发新的GreaseMonkey脚本的方法是从他们的示例脚本开始,然后按照增量试用版进行操作。错误路径。
扩展:我发现的另一个麻烦:脚本中await
的存在似乎使得油脂能够忽略整个脚本等。在这个例子中,它似乎没有发生,但在更复杂的脚本中,它确实发生了。我没有太深入地调试它 - 我只是忽略await
并使用旧方式的Promises(GM.getValue("myValue").then(function(myValue) { ... });
)。它使代码更糟糕,但也是如此。