Maison > interface Web > js tutoriel > le corps du texte

Accès JS aux exemples d'utilisation des fonctions SWF_compétences Javascript

WBOY
Libérer: 2016-05-16 15:51:52
original
948 Les gens l'ont consulté

L'exemple de cet article décrit l'utilisation des fonctions de JS pour accéder à SWF. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :

Il y a eu de nombreux exemples où Flash et JS s'appellent. Ce n'est pas un problème. Bien sûr, les erreurs d'appel ne sont pas une erreur entre Flash et JS. Aujourd'hui, nous allons résoudre complètement le problème d'incompatibilité entre IE, FF et Chrome. .

Nous savons qu'en Flash, si vous accédez à des fonctions JS externes, il vous suffit de

Copier le code Le code est le suivant :
flash .external.ExternalInterface.call("Nom de la fonction en JS");
Cette phrase est suffisante

Si vous souhaitez que JS accède aux fonctions dans Flash, vous devez enregistrer une fonction de rappel avec addCallBack et laisser JS l'appeler (exemple AS2)

import flash.external.*;
var methodName:String = "SetImgPath";
//JS需要调用的函数名字
var instance:Object = null;
var method:Function = extractstr;
//Flash中实际的函数名字,参数忽略,但是你调用的时候要记得有参数的要加上
var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method);
trace(wasSuccessful+"-callback")

Copier après la connexion

Nous pouvons le retracer. Si c'est vrai à ce moment-là, cela signifie que l'enregistrement est réussi

OK, essayez-le sur le web ci-dessous :

<div style="margin-left:50px; margin-bottom:50px"><input type="text" id="mytxt" border="1" value="这是测试框,调用页面JS演示" style="width:200px"/></div>
  <div id="flashContent">
   <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="515" height="320" id="123" align="middle">
    <param name="movie" value="123.swf" />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#000000" />
    <param name="play" value="true" />
    <param name="loop" value="true" />
    <param name="wmode" value="transparent" />
    <param name="scale" value="showall" />
    <param name="menu" value="true" />
    <param name="devicefont" value="false" />
    <param name="salign" value="" />
    <param name="allowScriptAccess" value="sameDomain" />
    <!--[if !IE]>-->
    <object type="application/x-shockwave-flash" data="123.swf" width="515" height="320"><!--下面针对非IE内核浏览器--> 
     <param name="movie" value="123.swf" />
     <param name="quality" value="high" />
     <param name="bgcolor" value="#000000" />
     <param name="play" value="true" />
     <param name="loop" value="true" />
     <param name="wmode" value="transparent" />
     <param name="scale" value="showall" />
     <param name="menu" value="true" />
     <param name="devicefont" value="false" />
     <param name="salign" value="" />
     <param name="allowScriptAccess" value="sameDomain" />
    <!--<![endif]-->
     <a href="upload/2011/1/201101281000491420.gif" alt="获得 Adobe Flash Player" />
     </a>
    <!--[if !IE]>-->
    </object>
    <!--<![endif]-->
   </object>
  </div>

Copier après la connexion

OK, nous ajoutons un bouton au Web pour appeler ce flashcall :

Testez-le :

Tout fonctionne bien pour IE6, 7, 8, 9

FF : Échec

Chrome : Échec

Cause de l'échec : SetImgPath n'est pas une fonction/non défini)

C'est très étrange, nous pouvons utiliser une alerte pour afficher

Copier le code Le code est le suivant :
thisMovie ("123") : alert(thisMovie("123"));

Le résultat de sortie n'est pas Null, ce qui signifie que notre Flash a été trouvé, mais pourquoi FF et Chrome ne peuvent-ils pas toujours trouver la fonction ?

Après avoir parcouru divers forums, le consensus est que addCallback doit être chargé avec flash avant que l'enregistrement puisse réussir. Eh bien, ajoutons une fonction settimeout pour déterminer si le chargement est réussi :

.
function flashcall(str){  
     try{   
  thisMovie("123").SetImgPath(str);//注意,123是上面的ID,而SetImgPath是我们Flash中的注册的回调函数
 }cache(e){
  settimeout("flashcall(str)",100 );
       }
}

Copier après la connexion

Eh bien, nous utilisons un settimeout et l'appelons toutes les 100 millisecondes, s'il y a une exception, nous continuerons à appeler jusqu'à ce qu'il réussisse !

Malheureusement, cela n'a jamais abouti et le programme est entré dans une boucle infinie !

Après avoir consulté diverses informations, j'ai enfin trouvé la raison :

Le navigateur dans FF ne reconnaît que la balise d'intégration, donc si vous utilisez getElementById pour obtenir du flash, vous devez baliser l'intégration avec un ID qui reconnaît la balise d'objet, vous devez donc marquer l'ID sur l'objet. 🎜>

Comprenez-vous ? Il s'avère que dans FF et Chrome, Flash doit utiliser embed pour identifier son ID, et la balise Object ne peut pas identifier l'ID. Le HTML que j'utilise est automatiquement généré par Flash, et ce sont toutes des balises Object. , ce qui est nuisible Après un après-midi de débogage, j'ai réalisé que le problème était là.

Maintenant que vous connaissez la raison, ce sera plus facile à gérer. Changez l'étiquette :

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="515" height="320" id="123" title="123" align="middle">
 <param name="allowScriptAccess" value="always" />
 <param name="movie" value="123.swf">
 <param name="quality" value="high">
  <param name="wmode" value="transparent" />
 <embed src="123.swf" name="123" quality="high" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="515" height="320"></embed>
</object>

Copier après la connexion
Changez la balise intégrée dans Flash par celle ci-dessus, et tout va bien !

J'espère que cet article sera utile à la conception de la programmation JavaScript de chacun.

Étiquettes associées:
js
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!