javascript - 带有Grease Monkey的Javascript:@grant弄乱了YouTube API

标签 javascript youtube

我正在使用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/

相关文章:

javascript - 将 S3 中的对象从一个文件夹复制到同一存储桶中的另一个文件夹

php - PHP和XML根据属性查找节点,以查找另一个属性或该节点的索引

youtube - 从我的页面检查嵌入式YouTube视频的观看次数

javascript - 为多个js文件配置baseUrl的最佳方式

javascript - Chrome 扩展程序 : pushing information gathered before a new tab is created?

javascript - javascript regex exec不一致

javascript - IE 的 AJAX document.getElementById().innerHTML 问题?

javascript - 使用 Javascript 添加 Youtube 订阅按钮

ios - 在 iOS Swift 中下载 mp3 格式的 youtube 视频

youtube api - 获取订阅的时间戳