flash 已被所有主流浏览器彻底禁用,object 与 embed 嵌套写法仅对极少数旧系统(如 ie11 + 手动启用 flash)有效;其嵌套是为兼容 ie 的 activex 与非 ie 浏览器的 embed 加载机制,现代环境完全失效。

Flash 已在所有主流浏览器中被彻底禁用,object 与 embed 标签组合**无法在现代环境(Chrome 88+、Firefox 85+、Edge 90+、Safari 14+)中实际播放 SWF 文件**。这套写法只对极少数仍启用 NPAPI/ActiveX 插件的旧系统(如 Windows 7 + IE11 + 手动启用 Flash)有效,且 Adobe 官方已于 2020 年 12 月 31 日终止支持并停止更新 Flash Player。
为什么 object 和 embed 必须嵌套使用
这不是“推荐做法”,而是历史兼容性妥协的结果:IE(尤其是 IE6–11)依赖 classid 和 ActiveX 控件加载 Flash,完全忽略 embed;而 Firefox、Chrome 早期版本(v44 前)、Safari 则依赖 embed 的 src 和 type,不识别 classid。两者共存,本质是让不同渲染引擎各取所需。
常见错误现象:
-
object单独存在 → IE 可能加载,Firefox/Chrome 显示空白或 fallback 文本 -
embed单独存在 → IE11 可能勉强工作(若插件未被策略禁用),但 Chrome 55+ 后直接无视 -
embed写在object外部 → 某些旧版 Safari 会同时尝试加载两次,引发重复初始化或脚本冲突
object 标签里哪些属性仍可能触发警告或失败
即使你坚持用这套结构,以下参数在当前环境下极易出问题:
-
classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000":仅 IE 识别,现代 Edge(Chromium 内核)和所有其他浏览器直接跳过;若页面启用了 strict CSP 策略,该字符串还可能被拦截为可疑 ActiveX 调用 -
codebase属性(如http://download.macromedia.com/...):域名早已失效,HTTP 请求返回 404,且现代浏览器禁止自动下载任何插件 -
param name="movie" value="xxx.swf"与data="xxx.swf"不一致 → 部分旧 IE 版本会优先读param,而data被忽略,导致路径错乱 -
pluginspage(在embed中):链接指向已下线的 Adobe 下载页,点击后 404,且现代浏览器根本不提供插件安装入口
如果必须维持旧页面可用,替代方案比硬塞 object+embed 更可靠
强行保留原始标签结构只会带来“看起来写了,实则无效”的假安全感。更务实的做法是:
- 用 JavaScript 检测
navigator.plugins或typeof ActiveXObject !== 'undefined'→ 若无 Flash 支持,立即隐藏object容器,显示降级提示(如静态图 + HTML5 动画链接) - 引入
swfobject.js(v2.4+):它内部做了 UA 判断和插件探测,不会盲目插入 DOM;若检测失败,可自动 fallback 到预设的div内容 - 部署 Ruffle(
ruffle.js):一个 WebAssembly 实现的 Flash 运行时,无需插件,只需把原object替换为<div data-ruffle-flash="my.swf"></div>并加载脚本即可 —— 这是目前唯一能在 Chrome/Firefox/Safari 上真正“运行”旧 SWF 的方案 - 绝对不要依赖
allowScriptAccess或flashvars传参:现代浏览器连沙箱都不存在了,这些参数根本不会被解析
真正棘手的不是怎么写标签,而是如何判断用户是否真的需要 Flash —— 如果只是展示动画效果,用 CSS @keyframes 或 Lottie(JSON 格式)替换成本更低;如果涉及旧交互逻辑(如 AS2/AS3 通信),Ruffle 是目前唯一可行的中间层。别在已关闭的门上反复拧把手。











