将任意flash对象wmode更改为透明

时间:2009-02-10 22:17:48

标签: javascript flash object swfobject wmode

我需要将wmode个任意flash对象从外部js文件更改为透明,以确保它们不使用Jquery或类似的库来隐藏菜单。

在FF中,我使用getElementsByTagName("embed")并设置属性。它似乎运作良好。

具体来说,我在object库设置swfObject时遇到问题。在IE7中。

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并使闪存不会隐藏浮动对象而不会成功,包括但不限于:

  1. 搜索OBJECT并将其PARAM wmode更改为transparent
  2. 设置Objectwmode=transparent
  3. 的属性
  4. 致电object的{​​{1}}功能
  5. 似乎无效。虽然wmode似乎改变了Flash仍然隐藏了高SetValue的其他对象。我在这里缺少什么?

5 个答案:

答案 0 :(得分:10)

我在这个小技巧上取得了成功:

$("embed").attr("wmode", "opaque").wrap('<div>');

它有效地重绘了flash对象,为我工作。

答案 1 :(得分:3)

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]);
    }
}

答案 2 :(得分:2)

当您使用SWFObject包含flash时,embedSWF方法中应该有一个名为'params'的参数。你将一个对象传递给它:

swfobject.embedSwf(blah,blah,blah, { wmode:'transparent'});

more here

答案 3 :(得分:1)

不需要重新发布flash电影来改变wmode参数 - 这是一个神话:

http://www.communitymx.com/content/article.cfm?cid=E5141

我有相同的菜单问题,我需要一些代码将wmode参数添加到javascript调用的任何flash对象中。

我认为最初的帖子与此有关,但我不知道从哪里开始并需要更多信息。

答案 4 :(得分:0)

我几乎100%确定您无法在运行时更改wmode参数。我的意思是,你在技术上可以,但不会有任何影响。我真的很惊讶你有任何成功的尝试。您成功尝试了哪些Flash播放器版本和浏览器?

对不起,我找不到任何官方链接来证明我的观点,但我会给你留下关于wmode如何工作的非常有趣的链接(更新到玩家10):

What does GPU acceleration mean?

干杯,