我正在使用GM为网站编写自定义脚本。该脚本将一个嵌入的Youtube播放器添加到页面,因此我正在调用Youtube API。这是代码的开头:
// ==UserScript==
// @author mens
// @match http://thewebsite.com
// @grant none
// ==/UserScript==
///////////// YOUTUBE
// API
var player;
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
// API loaded
window.onYouTubeIframeAPIReady = function()
{
console.log("API loaded");
}
使用此代码,一切正常。前几行调用API,在加载时会触发
onYouTubeIframeAPIReady
,然后稍后在我的脚本中生成player
。您会注意到
@grant
设置为none
。问题是当我更改这条线时,即使丝毫也没有。我使用GM_getResourceURL
访问外部文件(例如图形)。所以当我设置:
// @grant GM_getResourceURL
... API不再起作用:永远不会调用
onYouTubeIframeAPIReady
!根据我在GM文档中收集的内容,
@grant none
是默认模式,这意味着可以最大程度地访问代码中使用的所有API。更改@grant
时,可能会出现更多限制...我认为这是问题的一部分,但我不知道如何使用它。谢谢你的帮助 !!
最佳答案
因此,技巧很简单(但很神秘):我通过重命名功能将window
更改为unsafeWindow
:
unsafeWindow.onYouTubeIframeAPIReady = function()
{
console.log("API loaded");
}
来自GM文件:
unsafeWindow
The unsafeWindow object provides full access to the pages javascript functions and variables.
似乎除了
@grant
以外的任何none
都将window
对象放入沙箱中,并且无法从外部API进行访问。我仍然不确定如何正确设置这些限制,但是unsafeWindow
完全绕开了它们。
关于javascript - 带有Grease Monkey的Javascript:@grant弄乱了YouTube API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33044007/