javascript - Adobe ExternalInterface no funciona en IE9
flash actionscript (2)
He estado teniendo problemas similares, excepto que estaba trabajando en IE9 y no en IE7 / 8. Creo que la causa de ambos problemas es la misma. Lo resolví tropezando con este maravilloso artículo en A List: Apart http://www.alistapart.com/articles/flashsatay/
Después del artículo, su HTML correctamente formado debe leer:
<object type="application/x-shockwave-flash" data="/swf/movie.swf" width="1" height="1" id="MyMovie">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="/swf/movie.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffcc00" />
</object>
En particular, tenga en cuenta que agregué un type
y eliminé la etiqueta <embed>
.
Por lo que puedo ver, ya no es necesario usar la etiqueta <embed>
. Y eliminarlo significa que podemos usar un código mucho más simple para activar nuestra función ExternalInterface:
// After the flash object has loaded...
var movie = document.getElementById(''MyMovie'');
if (typeof movie.MyExternalFunction === ''function'') movie.MyExternalFunction();
Espero que esto ayude.
Estoy llamando a una función Actionscript desde JavaScript y funciona en todos los navegadores, excepto en IE9. Lo reduje a la función js que recupera el objeto de la película:
<script type="text/javascript">
var swf;
...
function flashReady() // This is called from ActionScript
{
swf = getSWF("MyMovie");
swf.MyExternalFunction();
}
function getSWF(movieName)
{
if (navigator.appName.indexOf("Microsoft") != -1)
{
return window[movieName];
}
else
{
return document[movieName];
}
}
...
</script>
Aquí está mi HTML:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="1" height="1" id="MyMovie">
<param name="allowScriptAccess" value="always" />
<param name="movie" value="/swf/movie.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffcc00" />
<embed src="/swf/movie.swf" quality="high" bgcolor="#ffcc00" width="1" height="1" name="MyMovie" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
Cuando estoy llamando a la función externa de esta manera:
swf.MyExternalFunction();
En IE9 me sale un error JS:
"Object doesn''t support property or method ''MyExternalFunction''"
Aparentemente window [movieName], que era bueno para IE, no funciona en IE9 como solía hacerlo. ¿Alguna sugerencia?
:::ACTUALIZAR:::
Aquí está mi solución hasta ahora. Puede que no se vea bonito, pero funciona:
var movie = false;
function initSWF(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
//alert("IE");
if (typeof (window[movieName].MyExternalFunction) == ''function'') {
// alert("< IE9");
movie = window[movieName];
}
else if (typeof (document[movieName].MyExternalFunction) == ''function'') {
// alert(">= IE9");
movie = document[movieName];
}
}
else {
// alert("NON IE");
movie = document[movieName];
}
return ((movie) ? true : false);
}
Entonces se usa como:
function flashReady() // This is called from ActionScript
{
if(initSwf("MyMovie")) {
movie.MyExternalFunction();
} else {
alert("Failed to initialize");
}
}
He tenido exactamente el mismo problema con IE9, para mí, fue el caso de IE9 almacenando en caché el flash. Intente borrar el caché del navegador (f12 para herramientas de desarrollador y hay un ícono para borrar el caché o ctrl-R, creo), y luego darle una oportunidad de nuevo.
Si eso no funciona, intente depurar demorando su llamada javascript a actionscript por 1 o 2 segundos, algo parecido a esto:
<SCRIPT LANGUAGE=''Javascript''>
function delayForFlash() {
setTimeout("startFlash()", 1000);
}
function startFlash() {
getFlashMovie("flashdemo").restartFlash();
}
window.onload = function(){ delayForFlash();}
</SCRIPT>
Esto es para dar tiempo suficiente para que su flash cargue todo.