Chrome 66:iframe中Flash需切换缩放才显示的问题求助
解决Chrome 66中iframe内嵌Flash(swfobject)不渲染的问题
我之前也碰到过类似的Chrome Flash渲染异常问题,结合你已经尝试过的方案,给你几个针对性的临时修复思路,应该能解决必须缩放才能显示的问题:
1. 主动触发Flash容器的重绘事件
缩放操作本质上是强制浏览器触发了重排重绘,所以我们可以用JS主动模拟这个过程,在Flash加载完成后强制触发重绘:
首先,在swfobject的嵌入回调里添加重绘逻辑:
swfobject.embedSWF( "your-content.swf", "flash-container", "100%", "600", // 确保高度是具体像素值,避免布局计算异常 "11.0.0", // 尽量指定符合你Flash版本的最低要求 null, null, { play: false, wmode: "opaque", // 避免wmode=window可能导致的层级渲染问题 allowScriptAccess: "always" }, null, function(embedResult) { if (embedResult.success) { // 强制触发容器重绘 const flashContainer = document.getElementById("flash-container"); // 先给容器一个微小的缩放变化 flashContainer.style.transform = "scale(1.0001)"; // 下一帧恢复,触发重绘 requestAnimationFrame(() => { flashContainer.style.transform = "scale(1)"; }); } } );
这个方法直接模拟了缩放带来的重绘效果,不需要用户手动操作。
2. 延迟Flash的初始化时机
Chrome 66对iframe内的资源加载有更严格的时序控制,可能iframe还没完成布局就初始化了Flash,导致渲染异常。可以等iframe完全加载后再嵌入Flash:
在父页面中监听iframe的load事件,再触发iframe内部的Flash嵌入:
const targetIframe = document.getElementById("your-iframe"); targetIframe.addEventListener("load", () => { // 确保iframe的上下文已就绪 if (targetIframe.contentWindow?.runFlashEmbed) { targetIframe.contentWindow.runFlashEmbed(); } });
然后在iframe的页面中定义runFlashEmbed函数,把swfobject的嵌入逻辑放在这个函数里:
function runFlashEmbed() { swfobject.embedSWF(/* 你的嵌入参数 */); }
3. 检查并确认Flash权限细节
虽然你已经排除了尺寸和隐藏的问题,但Chrome 66对iframe内的Flash还有一个细节:如果iframe是跨域的,可能需要在父页面和iframe页面都确保Flash权限被允许。你可以点击地址栏右侧的Flash图标,确认当前域名和iframe域名的Flash权限都是"允许"状态。
为什么缩放能解决问题?
Chrome 66为了优化性能,对非活跃或布局未稳定的Flash内容会延迟渲染。缩放操作会触发浏览器的全局布局计算,强制重新渲染所有可视元素,包括之前被延迟渲染的Flash内容。而修复后重启标签页仍有效,是因为Chrome会缓存该Flash内容的渲染状态,下次加载时直接复用。
内容的提问来源于stack exchange,提问作者red6
相关产品推荐
相关产品推荐

