【问题标题】:swfobject.embedSWF not working?swfobject.embedSWF 不工作?
【发布时间】:2016-11-30 05:27:43
【问题描述】:

以下使用 SWFObject 将 Flash 动画嵌入 HTML 文档的代码仅显示替代内容。为什么?

<!DOCTYPE html>
<html>
    <head>
        <title>Adding a Flash Movie</title>
        <script type="text/javascript"
                src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js">
        </script>
        <script type="text/javascript">
            swfobject.embedSWF("flash/bird.swf", "bird", "400", "300", "8.0.0");
        </script>
    </head>
    <body>
        <div id="bird">
            <p>An animation of a bird taking a shower</p>
        </div>
    </body>
</html>

Chrome、IE 和 Firefox 都只显示An animation of a bird taking a shower

代码是a sample 来自本书HTML & CSS: design and build websites

【问题讨论】:

  • 许多最近的浏览器都删除了 Flash 支持。使用前请检查浏览器兼容性。
  • Flash 支持并未从浏览器中移除。相反,Flash 现在仅在“要求激活”弹出窗口后启用。不幸的是,swfobject 不适用于这种较新的方案。
  • Flash 将在 2020 年结束生命周期,@Chris。到那时,浏览器厂商将逐渐限制 Flash 的使用,直到最终完全放弃对 Flash 的支持。请参阅我在您的答案中编辑的链接。
  • 在隐藏的iframe 中加载https://get.adobe.com/flashplayer/ 将提示用户授予运行Flash 的权限。见Flash Roadmap for Chromiumthe answer I got this info from

标签: javascript html swfobject


【解决方案1】:

SWFObject 2.2 不再正常工作。 bug in SWFObject 已在 GitHub 上报告,但该库未维护。

从 Chrome 55 开始的新“默认 HTML”Flash 政策不会初始化 SWFObject 用于检测是否安装了 Flash 的变量。具体来说,navigator.mimeTypes 不再包含application/x-shockwave-flash,除非用户启用了 Flash。其他浏览器也存在与作为Flash’es end of life 的一部分引入的click-to-run activation scheme 相关的类似问题。

此时,最好的做法可能是简单地使用&lt;object&gt; 嵌入Flash。例如:

<object type="application/x-shockwave-flash" data="app.swf">
    <param name='movie' value="app.swf"/>
    <param name='bgcolor' value="#999999"/>
    <param name='FlashVars' value="var1=Hello&var2=Goodbye" />
    <param name='allowscriptaccess' value="sameDomain"/>
</object>

注意 (1) .swf 在两个地方指定 (2) 只需要 movie 参数;此处显示其他参数作为可能的示例。

【讨论】:

    【解决方案2】:

    Chrome 从 55 版开始不会初始化 swfobject 需要检测是否安装了 Flash 的变量。 您可以将原始补丁应用于 swfobject js 以跳过 hasPlayerVersion 检查:

    -       if (hasPlayerVersion(swfVersionStr)) { // create SWF
    +       try {  // create SWF
                var obj = createSWF(att, par, replaceElemIdStr);
                if (att.id == replaceElemIdStr) {
                    setVisibility(replaceElemIdStr, true);
                }
                callbackObj.success = true;
                callbackObj.ref = obj;
    -       }
    -       else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
    -           att.data = xiSwfUrlStr;
    -           showExpressInstall(att, par, replaceElemIdStr, callbackFn);
    -           return;
    -       }
    -       else { // show alternative content
    +       } catch (e) {  // show alternative content
                setVisibility(replaceElemIdStr, true);
            }
    

    【讨论】:

    • 也可以把hasPlayerVersion()改成一直返回true?
    • 否,因为它不会在旧浏览器中显示 replaceElemIdStr
    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2011-10-13
    • 2011-11-25
    • 2021-01-10
    • 1970-01-01
    相关资源
    最近更新 更多