javascript - swfobject example
Cambio de objetos flash arbitrarios wmode a transparente (5)
Cuando está utilizando SWFObject para incluir el flash, debe haber un parámetro en el método embedSWF llamado ''params''. Usted le pasa un objeto en esto así:
swfobject.embedSwf(blah,blah,blah, { wmode:''transparent''});
Necesito cambiar wmode
de objetos flash arbitrarios a transparente desde el archivo js externo para asegurarme de que no oculten los menús sin usar Jquery o libs similares.
En FF utilizo getElementsByTagName("embed")
y establezco el atributo. Parece que funciona bien.
Específicamente, tengo problemas con el conjunto de swfObject
biblioteca swfObject
en IE7.
swfObject
crea el siguiente código en 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>
Probé todas las formas posibles para configurar wmode
en transparent
y hacer que el flash no oculte los objetos flotantes sin éxito, incluidos, entre otros:
- Busque
OBJECT
y cambie su modoPARAM
atransparent
. - Establecer atributo de
Object
(wmode=transparent
) - Llamar a la función
SetValue
delobject
Ninguno parece funcionar. Aunque el modo w parece cambiar Flash, aún oculta otros objetos con alto z-index
. ¿Que me estoy perdiendo aqui?
Estoy casi 100% seguro de que no puedes cambiar el parámetro wmode en tiempo de ejecución. Quiero decir, técnicamente puedes, pero no tendrá ningún efecto. De hecho, me sorprende que hayas tenido algún intento exitoso. ¿Qué versión de Flash player y navegador intentó con éxito?
Lamento no poder encontrar ningún enlace oficial para probar mi punto, pero te dejaré este enlace muy interesante sobre cómo funciona wmode (actualizado al reproductor 10):
¿Qué significa aceleración GPU?
Aclamaciones,
Juan
No es cierto que una película flash deba volver a publicarse para cambiar el parámetro wmode; es un mito:
http://www.communitymx.com/content/article.cfm?cid=E5141
Tengo el mismo problema de menú y necesito un código para agregar el parámetro wmode a cualquier objeto flash que javascript llame.
Creo que la publicación original se refiere a esto, pero no estoy seguro por dónde empezar y necesito más información.
He tenido éxito con este pequeño truco:
$("embed").attr("wmode", "opaque").wrap(''<div>'');
Redacta eficazmente el objeto flash, funcionó para mí.
La solución de Cirday en general es la correcta. Aquí hay una versión que no es jQuery, que funciona en IE, FF y 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]);
}
}