2009-08-18 6 views
2

Pour un projet en cours, nous utilisons SwfObject 2.2 pour incorporer des fichiers flash, et les gourous CRD utilisent SwfAddress 2.3 pour créer un bon instantané SEO.SwfAddress conflit avec l'argument 'callback' de SwfObject

Il s'avère que si les deux bibliothèques sont incluses dans une page, toute tentative d'utilisation du rappel SwfObject dans l'API (http://code.google.com/p/swfobject/wiki/api) empêche le chargement de SwfObject. Dans l'exemple, vous pouvez basculer ceci simplement en HTML en commentant le fichier SwfAddress. Désolé, je ne pouvais pas pointer vers les URL absolues pour ces deux bibliothèques dans mon code ci-dessous.

<head> 
    <title>SWFObject 2.2 dynamic embed with callback</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" src="swfaddress.js"></script> 
    <script type="text/javascript"> 
    function outputStatus(e) { 
     alert("e.success = " + e.success +"\ne.id = "+ e.id +"\ne.ref = "+ e.ref); 
    } 
    var params = {}; 
    params.allowscriptaccess = "always"; 

    swfobject.embedSWF("http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test6.swf", "myContent1", "300", "120", "9.0.0", "expressInstall.swf", null, null); 
    swfobject.embedSWF("http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test6.swf", "myContent2", "300", "120", "9.0.0", "expressInstall.swf", null, params, null, outputStatus); 
    </script> 
</head> 

<body> 
    <div id="myContent1"> 
     <h1>Alternative content</h1> 
     <p><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></p> 
    </div> 
    <div id="myContent2"> 
     <h1>Alternative content</h1> 
     <p><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></p> 
    </div> 
</body> 

Toutes les idées? Merci d'avance!

+0

Pour moi cela a résolu un problème où l'événement SWFAddress.as externalChange ne tirait pas (le swf était toujours incorporé correctement) – user531694

Répondre

2

Cela a été difficile.

Réponse rapide: Vous devez passer des objets vides au lieu de "null" pour les flashVars et les attributs: (See my corrected demo code here)

swfobject.embedSWF("http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test6.swf", "myContent1", "300", "120", "9.0.0", "expressInstall.swf", {}, {}); 
swfobject.embedSWF("http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test6.swf", "myContent2", "300", "120", "9.0.0", "expressInstall.swf", {}, params, {}, outputStatus); 

réponse complète: Creuser dans le code source SWFAddress, ils réécrivent l'embed SWFObject fonctionnalité afin qu'ils puissent injecter les leurs. Une des choses qu'ils doivent faire pour cela est de transférer tous les paramètres que vous passez dans leur propre fonction. Le « null » vous passez l'objet d'attributs était à l'origine une erreur dans le code SWFAddress ici:

var _s2e = swfobject.embedSWF; 
    swfobject.embedSWF = function() { 
    _args = arguments; 
    if (typeof _args[8] == UNDEFINED) 
     _args[8] = {}; 
    if (typeof _args[8].id == UNDEFINED) 
     _args[8].id = _args[1]; // <-- ERROR here when this parameter (attributes) is null. 
     _s2e.apply(this, _args); 
     _ref.addId(_args[8].id); 
    } 

L'erreur a causé toute la seconde Embed à l'échec.

+0

Merci, c'était exactement ça :) J'aurais dû le supposer, car SwfObject requiert aussi des objets vides. Comme je l'ai copié à partir de la documentation d'Adobe, j'ai juste pensé que ça marcherait. Doh! – mummybot

+0

+1. Bon vieux stackoverflow, ça me fait gagner du temps depuis 2008. –