Javascript with Grease Monkey : @grant messes up Youtube API
Javascript with Grease Monkey : @grant messes up Youtube API
我使用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
unsafeWindow对象提供了对页面javascript函数和变量的完全访问。
似乎除了none
之外,任何@grant
都将window
对象放入限制外部api访问的沙箱中。我仍然不确定如何正确设置这些限制,但unsafeWindow
完全绕过它们。
代替
// API loaded
window.onYouTubeIframeAPIReady = function()
{
console.log("API loaded");
}
这样做
function apiReady() {
console.log("API loaded");
}
exportFunction(apiReady, unsafeWindow, {defineAs: "onYouTubeIframeAPIReady"});
查看Mozilla文档中的exportFunction
说明然而,我自己还没有100%确信这比直接使用unsafeWindow
更"安全"(在greasemonkey中)
根据我在GM文档中收集到的信息,@grant none是默认模式,这意味着对代码中使用的所有api的最大访问权限。
这是不正确的。@grant none
所做的是显式地关闭所有 greasemonkey API (GM*函数)并在没有沙箱的情况下运行脚本,因为没有恶意网站使用greasemonkey针对您的可能性。
- KeyPress和Keydown在这个特定的代码上不起作用.只有key-up起作用
- Fancybox iFrame not showing up
- 在key up函数上将文本框值传递给javascript
- Backbone.js Visual Studio set up
- new Date('2011-12-15 00:00:00') is showing up as NaN
- 取消以前的Jquery Form Submit on Key Up
- Speeding up JavaScript
- .val() rounding up?
- setInterval Speed Up | Javascript
- JS/JQuery更改类和SlideDown/Up
- Count up javascript
- 如何阻止Javascript Pop Up移动到页面顶部
- LearnBoost的Up for Node.js似乎无法正确重新启动我的应用程序
- cleditor comes up disabled
- Javascript round up values
- getElementById not showing up
- VB.NET Awesomium ExecuteJavaScriptWithResult Pulling Up Unde
- Angular的指令作为Web组件 - 为什么需要up
- Javascript/jQuery video Pop-up
- Javascript with Grease Monkey : @grant messes up Youtube API