Changing arbitrary flash objects wmode to transparent

醉酒当歌 提交于 2019-11-30 03:18:36

问题


I need to change wmode of arbitrary flash objects to transparent from external js file to make sure they don't hide menus without using Jquery or similar libs.

In FF I use getElementsByTagName("embed") and set attribute. It seems to work well.

Specifically I'm having trouble with object set by swfObject library In IE7.

swfObject creates the following code in 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>

I tried every possible way to set wmode to transparent and make the flash not hide floating objects without success including but not limited to:

  1. Search for OBJECT and change its PARAM wmode to transparent.
  2. Set attribute of Object (wmode=transparent)
  3. Call the object's SetValue function

None seems to work. Although the wmode seems to change Flash still hides other objects with high z-index. What am I missing here?


回答1:


I've been successful with this little trick:

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

It effectively redraws the flash object, worked for me.




回答2:


Cirday's solution in general is the right one. Here's a non-jQuery version, that works in IE, FF and 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]);
    }
}



回答3:


When you are using SWFObject to include the flash, there should be a parameter in the embedSWF method called 'params'. You pass it an object into it like this:

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

more here




回答4:


It's not true that a flash movie needs to be republished to change the wmode parameter - its a myth:

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

I have the same menu problem, and I need some code to add the wmode parameter to any flash object being called by javascript.

I think the original post pertains to this, but I'm not sure where to start and need more info.




回答5:


I'm almost 100% sure that you cannot change the wmode parameter at runtime. I mean, you technically can, but won't have any effect. I'm actually surprised that you got any successful attempts. What Flash player version and browser did you try successfully?

I'm sorry I can't find any official link to prove my point, but I'll leave you this very interesting link about how wmode works (updated to player 10):

What does GPU acceleration mean?

Cheers,

Juan



来源:https://stackoverflow.com/questions/534474/changing-arbitrary-flash-objects-wmode-to-transparent

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!