【问题标题】:SWFobject in a Chrome Extension - API UnavaiableChrome 扩展程序中的 SWF 对象 - API 不可用
【发布时间】: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 扩展程序中。谁能确认一下?

标签: google-chrome youtube google-chrome-extension swfobject soundcloud


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    在主页面,

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

      addEventListener().

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多