Chrome 扩展程序中的 SWF 对象 - API 不可用

Posted

技术标签:

【中文标题】Chrome 扩展程序中的 SWF 对象 - API 不可用【英文标题】:SWFobject in a Chrome Extension - API Unavaiable 【发布时间】:2011-11-08 14:52:04 【问题描述】:

嗨! 我正在构建一个 Chrome 扩展程序,我需要在后台页面中嵌入一个 SWF 对象。 除了 SWFobject 和 eventListener 的 javascript 控件之外,一切都正常。 我的猜测是它与跨域策略有关,因为在网络服务器上测试页面时一切正常。

无论如何,这是一个sn-p:

在主页中:

var playerView =  chrome.extension.getBackgroundPage(); 
$('#playerPause').click(function()
    playerView.playerPause();
);

在后台:

function playerPause() 
    if (postData[nowPlaying].provider == 'youtube' ) 
        player.pauseVideo();
     
    else if (postData[nowPlaying].provider == 'soundcloud' ) 
        player.api_pause();
    ;

还有 eventListeners

soundcloud.addEventListener('onMediaEnd', playerNext);

function onYouTubePlayerReady(player) 
    player.addEventListener("onStateChange", "function(state) if(state == 0)  playerNext();  ");

在控制台中抛出

"Uncaught TypeError: Object # has no method '暂停视频'"

对于 Youtube 都嵌入了 Soundcloud 一个。

另外,SWFobject 是这样嵌入的(并且可以工作):

function loadTrack (id) 
    if(postData[id].provider == 'youtube') 
        swfobject.embedSWF(
            "http://www.youtube.com/e/" + postData[id].url + "?enablejsapi=1&playerapiid=player",
            "player",
            "1",
            "1",
            "8",
            null,
            
                autoplay: 1
            ,
            
                allowScriptAccess: "always"
            ,
            
                id: "player"
            
        );
    
    else if(postData[id].provider == 'soundcloud') 
        swfobject.embedSWF(
            'http://player.soundcloud.com/player.swf',
            'player',
            '1',
            '1',
            '9.0.0',
            'expressInstall.swf',
            
                enable_api: true, 
                object_id: 'player',
                url: postData[id].url,
                auto_play: true
            ,
            
                allowscriptaccess: 'always'
            ,
            
                id: 'player',
                name: 'player'
            
        );
    

抱歉,帖子太长了,我想提供尽可能多的信息。 另外,我知道代码不漂亮,这只是我的第二个应用程序;)

非常感谢任何可以提供帮助的人, 贾科莫

【问题讨论】:

没有答案,但有一个建议:您的 YouTube SWFObject 代码在两个不同的地方声明了 FlashVars;我建议您简化为单一方法。 ?enablejsapi=1&playerapiid=player 可以作为 autoplay: 1, enablejsapi: 1, playerapiid: "player" 插入到 FlashVars 对象中。或者,您可以将“自动播放”移动到查询字符串中:?enablejsapi=1&playerapiid=player&autoplay=1 @pipwerks 感谢您的建议,我不知道我是怎么忘记的! 我对如何定义“玩家”感到困惑。有时它是全局的(在“playerPause”中),有时是本地的(在“onYouTubePlayerReady”中),也许那里有提示。 @mjhm 你是对的,这有点令人困惑,所以我在他们的教程中将值更改为默认值(我很绝望),但它仍然无法正常工作。 onYouTubePlayerReady 函数永远不会被触发,即使我从控制台触发它,我也会发现这些方法是未定义的...... 我担心的是:(来自文档)注意:要测试这些调用中的任何一个,您必须让文件在网络服务器上运行,因为 Flash 播放器会限制本地文件和互联网。 这意味着 Youtube 播放器不能嵌入到 Chrome 扩展程序中。谁能确认一下? 【参考方案1】:

你可以看看this extension,你不能在 chrome 扩展中访问本地连接,但你可以运行一个内容脚本作为代理脚本。(你可以在 gae 或任何其他免费服务器上提供代理页面)

【讨论】:

【参考方案2】:

这里的问题是,自从清单发展到 v2 后,您就不能在 chrome 扩展中使用内联脚本或内联事件处理程序。

您应该为我添加清单文件以更好地了解发生了什么。但简而言之,你所能做的就是

在主页面,

删除所有内联脚本并将它们移动到外部 JS 文件中。 删除内联事件侦听器,将它们移动到相同或另一个外部 JS 并使用

addEventListener().

但问题是,您不能在后台页面中执行对 swf 的调用或期望它返回任何内容。所有这些都会继续给你"Uncaught TypeError"Exception。

以网络摄像头图像捕获 swf 为例,网络摄像头将被流式传输到页面,但永远无法对其进行函数调用,因此永远不会捕获图像。 由于这个原因,我从插件弹出窗口中扫描二维码的项目遇到了废墟。

【讨论】:

以上是关于Chrome 扩展程序中的 SWF 对象 - API 不可用的主要内容,如果未能解决你的问题,请参考以下文章

Chrome扩展程序的chrome对象属性未定义

无法从Chrome中的http源(wildfly服务器)加载swf文件?

为SWF嵌入新对象

chrome 扩展中的跨域 XMLHttpRequest

如何使用 chrome.tabs.getCurrent 在 Chrome 扩展程序中获取页面对象?

Chrome扩展程序中的无Chrome窗口?