将任意 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) 调用objectSetValue函数

似乎没有一个工作。虽然 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 透明背景

DataGridView透明行选择和双击背景颜色更改

html wmode对flash元素不透明或透明

CSS 在Windows上使用Firefox 3并且wmode透明或不透明时,删除SWF周围的虚线边框

WMODE 和 Flash 视频 - 稳定性和性能

如何以编程方式将所有 <object> 设置为将 wmode 设置为不透明?