Heim  >  Artikel  >  Web-Frontend  >  JS-Zugriff auf SWF-Funktionsverwendungsbeispiele_Javascript-Kenntnisse

JS-Zugriff auf SWF-Funktionsverwendungsbeispiele_Javascript-Kenntnisse

WBOY
WBOYOriginal
2016-05-16 15:51:52949Durchsuche

Das Beispiel in diesem Artikel beschreibt die Funktionsverwendung von JS für den Zugriff auf SWF. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:

Es gab viele Beispiele für gegenseitige Aufrufe von Flash und JS. Natürlich sind Aufruffehler kein Fehler zwischen Flash und JS. Heute werden wir das Inkompatibilitätsproblem zwischen IE, FF und Chrome vollständig lösen . !

Wir wissen, dass Sie in Flash, wenn Sie auf externe JS-Funktionen zugreifen, nur

den Code kopieren müssen Der Code lautet wie folgt:
flash .external.ExternalInterface.call("Funktionsname in JS");
Dieser Satz reicht

Wenn Sie möchten, dass JS auf Funktionen in Flash zugreift, müssen Sie eine Rückruffunktion bei addCallBack registrieren und diese von JS aufrufen lassen (AS2-Beispiel)

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

Wir können es zu diesem Zeitpunkt zurückverfolgen, was bedeutet, dass die Registrierung erfolgreich war

OK, probieren Sie es unten im Internet aus:

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

OK, wir fügen dem Web eine Schaltfläche hinzu, um diesen Flashcall aufzurufen: d23c0d44edc17d1f5a19048da934879f

Testen Sie es:

Alles funktioniert gut für IE6, 7, 8, 9

FF: Fehlgeschlagen

Chrome: Fehlgeschlagen

Fehlerursache: SetImgPath ist keine Funktion/nicht definiert)

Das ist sehr seltsam, wir können eine Warnung verwenden, um

Code kopieren auszugeben. Der Code lautet wie folgt:
thisMovie ("123"): alarm(thisMovie("123"));

Das Ausgabeergebnis ist nicht Null, was bedeutet, dass unser Flash gefunden wurde, aber warum können FF und Chrome die Funktion nicht immer finden?

Nach dem Durchsuchen verschiedener Foren ist man sich einig, dass addCallback mit Flash geladen werden muss, bevor die Registrierung erfolgreich sein kann. Nun, fügen wir eine Settimeout-Funktion hinzu, um festzustellen, ob das Laden erfolgreich ist:

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

Nun, wir verwenden ein settimeout und rufen es alle 100 Millisekunden auf. Wenn es eine Ausnahme gibt, werden wir so lange anrufen, bis es erfolgreich ist!

Leider gelang es nicht und das Programm geriet in eine Endlosschleife!

Nachdem ich verschiedene Informationen konsultiert hatte, fand ich endlich den Grund:

Der Browser in FF erkennt nur das Einbettungs-Tag. Wenn Sie also getElementById verwenden, um Flash zu erhalten, müssen Sie die Einbettung mit einer ID versehen. IE erkennt das Objekt-Tag, also müssen Sie die ID auf dem Objekt markieren 🎜>

Verstehen Sie, dass Flash in FF und Chrome Embed verwenden muss, um seine ID zu identifizieren, und das Object-Tag die ID nicht identifizieren kann. Das von mir verwendete HTML wird automatisch von Flash generiert und besteht ausschließlich aus Object-Tags , was schädlich ist. Nachdem ich einen Nachmittag lang debuggt hatte, wurde mir klar, dass hier das Problem liegt.

Jetzt, da Sie den Grund kennen, wird es einfacher, damit umzugehen:

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

Ändern Sie das in Flash eingebettete Tag in das oben stehende, und alles ist in Ordnung!

Ich hoffe, dass dieser Artikel für das JavaScript-Programmierdesign aller hilfreich sein wird.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn