2009-02-10 22 views
10

Muszę zmienić wmode arbitralnych obiektów flash na przezroczyste z zewnętrznego pliku js, aby się upewnić, że nie ukrywają menu bez używania Jquery lub podobnych bibliotek.Zmiana dowolnych obiektów flash wmode na przezroczyste

W FF używam getElementsByTagName("embed") i ustaw atrybut. Wygląda na to, że działa dobrze.

W szczególności mam problem z object ustawiony przez swfObject biblioteki w IE7.

swfObject tworzy następujący kod w 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> 

Próbowałem każdy możliwy sposób, aby ustawić wmode do transparent i sprawi, że lampa nie ukrywać obiekty latające bez powodzenia w tym, lecz nie ograniczając się do:

  1. Wyszukaj OBJECT i zmień jego PARAMwmode na transparent.
  2. Ustaw atrybut Object (wmode=transparent)
  3. Wywołać object „s SetValue funkcji

Żaden wydaje się działać. Chociaż wmode wydaje się zmieniać Flash nadal ukrywa inne obiekty o wysokim z-index. Czego tu mi brakuje?

+0

Czy możesz podać trochę więcej informacji? Czy próbujesz ustawić to raz, lub wyłączyć i włączyć ponownie? Dlaczego nie można ustawić wmode, gdy strona jest po raz pierwszy zbudowana? – Andrew

Odpowiedz

2

Gdy używasz SWFObject do włączenia lampy błyskowej, powinien istnieć parametr w metodzie embedSWF o nazwie "params". Przekazać mu obiekt do niego tak:

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

more here

+0

Dzięki za odpowiedź. Nie mam kontroli nad częścią swfobject kodu. Po uruchomieniu mojego kodu obiekt jest już utworzony. – Nir

+0

To jest właściwy sposób, aby to zrobić. Powinieneś naprawdę zobaczyć, czy możesz uzyskać osobę, która kontroluje kod swfobject, aby dodać dodatkowy parametr. – jacobangel

0

jestem prawie w 100% pewien, że nie można zmienić parametr wmode przy starcie. Mam na myśli, że technicznie możesz, ale nie będziesz miał żadnego efektu. Właściwie to jestem zaskoczony, że masz udane próby. Jaką wersję Flash Player i przeglądarki próbowałeś?

przykro mi, że nie może znaleźć żadnej oficjalnej link udowodnić mój punkt widzenia, ale zostawię ci to bardzo ciekawy związek o jak wmode prace (zaktualizowane do odtwarzacza 10):

What does GPU acceleration mean?

Cheers,

Juan

+0

Używam IE7 i Flash Player v 9e. Musi być jakiś sposób obejścia tego problemu. być może ponowne uruchomienie odtwarzacza lub ponowne załadowanie filmu ??? Każdy pomysł zostanie doceniony. Utknąłem. – Nir

1

To nieprawda, że ​​film Flash musi być publikowane, aby zmienić parametr wmode - jego mitu:

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

Mam ten sam problem z menu i potrzebuję jakiegoś kodu, aby dodać parametr wmode do dowolnego obiektu flash wywoływanego przez javascript.

Myślę, że oryginalny post dotyczy tego, ale nie jestem pewien, od czego zacząć i potrzebuję więcej informacji.

10

Byłem sukces z tą małą sztuczkę:

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

Skutecznie odświeża obiekt flash pracował dla mnie.

+0

Nie jestem pewien, czy to jest "najlepsza" metoda, ale zadziałało to dla mnie. dzięki. –

+0

co za mistrz! – ifightcrime

3

Rozwiązanie firmy Cirday w ogóle jest właściwe. Oto wersja inna niż jQuery, która działa w IE, FF i 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]); 
    } 
} 
+0

Zapisz mój dzień !!!!!! – Shawn