将任意 Flash 对象 wmode 更改为透明
Posted
技术标签:
【中文标题】将任意 Flash 对象 wmode 更改为透明【英文标题】:Changing arbitrary flash objects wmode to transparent 【发布时间】:2010-10-06 18:37:05 【问题描述】:我需要将任意 Flash 对象的 wmode
更改为对外部 js 文件透明,以确保它们不会在不使用 Jquery 或类似库的情况下隐藏菜单。
在 FF 中,我使用 getElementsByTagName("embed")
并设置属性。它似乎运作良好。
具体来说,我在 IE7 中由swfObject
库设置的object
遇到问题。
swfObject
在 iE7 中创建以下代码:
<OBJECT id=mymovie height=400 width=134 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000>
<PARAM NAME="_cx" VALUE="3545">
<PARAM NAME="_cy" VALUE="10583">
<PARAM NAME="FlashVars" VALUE="">
<PARAM NAME="Movie" VALUE="imgs/site/tower.swf">
<PARAM NAME="Src" VALUE="imgs/site/tower.swf">
<PARAM NAME="WMode" VALUE="Window">
<PARAM NAME="Play" VALUE="0">
<PARAM NAME="Loop" VALUE="-1">
<PARAM NAME="Quality" VALUE="High">
<PARAM NAME="SAlign" VALUE="">
<PARAM NAME="Menu" VALUE="-1">
<PARAM NAME="Base" VALUE="">
<PARAM NAME="AllowScriptAccess" VALUE="">
<PARAM NAME="Scale" VALUE="ShowAll">
<PARAM NAME="DeviceFont" VALUE="0">
<PARAM NAME="EmbedMovie" VALUE="0">
<PARAM NAME="BGColor" VALUE="FFFFFF">
<PARAM NAME="SWRemote" VALUE="">
<PARAM NAME="MovieData" VALUE="">
<PARAM NAME="SeamlessTabbing" VALUE="1">
<PARAM NAME="Profile" VALUE="0">
<PARAM NAME="ProfileAddress" VALUE="">
<PARAM NAME="ProfilePort" VALUE="0">
<PARAM NAME="AllowNetworking" VALUE="all">
<PARAM NAME="AllowFullScreen" VALUE="false">
</OBJECT>
我尝试了所有可能的方法,将wmode
设置为transparent
,使flash不隐藏浮动对象而不成功,包括但不限于:
-
搜索
OBJECT
并将其 PARAM
wmode
更改为 transparent
。
设置Object
的属性(wmode=transparent
)
调用object
的SetValue
函数
似乎没有一个工作。虽然 wmode 似乎改变了 Flash 仍然隐藏了其他具有高z-index
的对象。我在这里错过了什么?
【问题讨论】:
您能提供更多信息吗?您只是想设置一次,还是将其关闭再打开?为什么第一次构建页面时无法设置 wmode?span> 【参考方案1】:当您使用 SWFObject 包含 flash 时,embedSWF 方法中应该有一个参数,称为“params”。您可以像这样将一个对象传递给它:
swfobject.embedSwf(blah,blah,blah, wmode:'transparent');
more here
【讨论】:
感谢您的回答。我无法控制代码的 swfobject 部分。当我的代码运行时,对象已经创建。 这是正确的做法。你真的应该看看你是否可以让控制swfobject代码的人添加额外的参数。【参考方案2】:我几乎 100% 确定您不能在运行时更改 wmode 参数。我的意思是,你在技术上可以,但不会有任何效果。我真的很惊讶你有任何成功的尝试。您尝试过的 Flash 播放器版本和浏览器是什么?
很抱歉,我找不到任何官方链接来证明我的观点,但我会给你留下这个关于 wmode 工作原理的非常有趣的链接(更新到播放器 10):
What does GPU acceleration mean?
干杯,
胡安
【讨论】:
我使用 IE7 和 flash player v 9e。必须有一些解决方法。也许重新启动播放器或重新加载电影???任何想法将不胜感激。我被困住了。【参考方案3】:Flash 电影需要重新发布才能更改 wmode 参数是不正确的 - 这是一个神话:
http://www.communitymx.com/content/article.cfm?cid=E5141
我有同样的菜单问题,我需要一些代码来将 wmode 参数添加到任何被 javascript 调用的 flash 对象。
我认为原始帖子与此有关,但我不确定从哪里开始,需要更多信息。
【讨论】:
【参考方案4】:这个小技巧我已经成功了:
$("embed").attr("wmode", "opaque").wrap('<div>');
它有效地重绘了 flash 对象,对我有用。
【讨论】:
我不确定这是否是“最佳”方法,但它对我有用。谢谢。【参考方案5】:Cirday 的解决方案通常是正确的。这是一个非 jQuery 版本,适用于 IE、FF 和 Chrome:
var embed = document.getElementsByTagName('embed');
for(var i = 0; i < embed.length; i++)
embed[i].setAttribute('wmode','opaque');
// FF does a "live" array when working directly with elements,
// so "els" changes as we add/remove elements; to avoid problems
// with indexing, copy to a temporary array
var els = document.getElementsByTagName('object');
var obj = [];
for(var i = 0; i < els.length; i++)
obj[i] = els[i];
for(var i = 0; i < obj.length; i++)
var param = document.createElement('param');
param.setAttribute('name','wmode');
param.setAttribute('value','opaque');
obj[i].appendChild(param);
var wrapper = document.createElement('div');
obj[i].parentNode.appendChild(wrapper);
if(obj[i].outerhtml)
// IE
var html = obj[i].outerHTML;
obj[i].parentNode.removeChild(obj[i]);
wrapper.innerHTML = html;
else
// ff/chrome
obj[i].parentNode.removeChild(obj[i]);
wrapper.appendChild(obj[i]);
【讨论】:
以上是关于将任意 Flash 对象 wmode 更改为透明的主要内容,如果未能解决你的问题,请参考以下文章
firefox flash wmode 直接 z-index 透明背景