addCallback() et doctype

Voilà une petite découverte qui m’a fait chercher un bon ptit moment l’autre jour. Voici un exemple:

ExternalInterface.addCallback("callAs", cb);
btn.addEventListener( MouseEvent.CLICK , clickHandler );
 
private function clickHandler( evt : MouseEvent ) : void
{
    if( ExternalInterface.available )
    {
        ExternalInterface.call( "callJS" );
    }
}
 
private function cb() : void
{
    trace("As called");
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <script type="text/javascript" src="swfobject.js"></script>
        <script type="text/javascript">
            var flashvars = {};
            var params = {};
            params.wmode = "transparent";
            params.allowscriptaccess = "always";
            var attributes = {};
            attributes.id = "flashcontent";
            attributes.name = "myFlashContent";
            swfobject.embedSWF("Main.swf", "myAlternativeContent", "800", "600", "10.0.0", false, flashvars, params, attributes);
 
            function callJS()
            {
                window.alert("callJS");
                flashcontent.callAs();
            }
        </script>
    </head>
    <body>
        <div id="myAlternativeContent">
            <a href="http://www.adobe.com/go/getflashplayer">
                <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
            </a>
        </div>
    </body>
</html>

Vous noterez que j’appelle le callback sur “flashcontent” qui est l’id du Flash. Et bien sous cette configuration callJS() est bien appelé, mais pas le callback. Mais étonnement tout s’exécute correctement si je supprime la première ligne du code html, le doctype. J’ai le même résultat sur Firefox 3.6 et Safari sur Mac. J’imagine que le fait d’effacer le doctype désactive le mode strict de rendu html.
La solution consiste, et c’est la bonne pratique à utiliser de toute manière, à utiliser document de cette manière :

document["flashcontent"].callAs();

Voilou, voilou

Tags: , , , ,

Leave a Reply