swfobject.embedSWF 不起作用?

IT技术 javascript html swfobject
2021-03-05 07:42:19

以下代码使用 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.

该代码是HTML 和 CSS:设计和构建网站一书中的示例

2个回答

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

从 Chrome 55 开始的新的“默认 HTML”Flash 策略不会初始化 SWFObject 用来检测是否安装了 Flash 的变量。具体来说,navigator.mimeTypes不再包含application/x-shockwave-flash,除非用户启用了 Flash。其他浏览器也存在与作为Flash 生命周期结束的一部分引入的点即用激活方案相关的类似问题

这时候,最好的做法可能就是简单地使用<object>嵌入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需要 param;其他参数在此处显示为可能的示例。

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?
2021-05-01 07:42:19
不,因为它不会在旧浏览器中显示 replaceElemIdStr
2021-05-19 07:42:19