Adobe ExternalInterface не работает в IE9 - PullRequest
3 голосов
/ 20 июля 2011

Я вызываю функцию Actionscript из JavaScript, и она работает во всех браузерах, кроме IE9. Я сузил это до функции js, которая получает объект фильма:

<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>

Вот мой 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>

Когда я вызываю внешнюю функцию следующим образом:

swf.MyExternalFunction(); 

В IE9 я получаю ошибку JS:

"Object doesn't support property or method 'MyExternalFunction'" 

Видимо, окно [movieName], которое было хорошо для IE, не работает в IE9 так, как раньше. Есть предложения?

::: UPDATE :::

Вот мое решение до сих пор. Может выглядеть не красиво, но работает:

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

Тогда он используется как:

function flashReady() // This is called from ActionScript
{
    if(initSwf("MyMovie")) {
        movie.MyExternalFunction();
    } else {
        alert("Failed to initialize");
    }
}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

У меня были похожие проблемы, за исключением того, что он работал в IE9, а не IE7 / 8. Я считаю, что причина обеих наших проблем одинакова. Я решил это, наткнувшись на эту замечательную статью в A List: Apart http://www.alistapart.com/articles/flashsatay/

После статьи ваш правильно сформированный HTML должен выглядеть следующим образом:

<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>

В частности, обратите внимание, что я добавил type и удалил тег <embed>.

Насколько я вижу, больше нет необходимости использовать тег <embed>. И удаление этого означает, что мы можем использовать намного более простой код для запуска нашей функции ExternalInterface:

// After the flash object has loaded...
var movie = document.getElementById('MyMovie');
if (typeof movie.MyExternalFunction === 'function') movie.MyExternalFunction();

Надеюсь, это поможет.

0 голосов
/ 20 июля 2011

У меня была точно такая же проблема с IE9, для меня это был случай, когда IE9 кэшировал флэш-память.Попробуйте очистить кеш браузера (f12 для инструментов разработчика и есть значок для очистки кеша или Ctrl-R, я думаю), а затем снова попробуйте.

Если это не так, попробуйте отладку, отложив JavaScriptвызовите Actionscript на 1 или 2 секунды, что-то вроде этого:

<SCRIPT LANGUAGE='Javascript'>

function delayForFlash() {
setTimeout("startFlash()", 1000);
}

function startFlash() {
getFlashMovie("flashdemo").restartFlash();
}

window.onload = function(){ delayForFlash();}
</SCRIPT>

Это достаточно времени, чтобы ваша вспышка загрузила все.

...