wie kann man javascript für die Kommunikation mit flash (Objekt #<HTMLObjectElement> hat keine Methode
Ich bin versucht, senden Sie eine einfache test-message aus javascript an flash, aber ich bin immer der Fehler:
Object #<HTMLObjectElement> has no method "listenToJS"
Ich gelesen habe, eine Reihe von Fragen auf, diese auf den stack, aber ich fühle mich wie entweder der browser ist nicht immer die richtige Referenz zu meinem flash-Objekt, oder in meinem actionscript-ich bin nicht putting meine flash-Funktion an der richtigen Stelle.
Also in html bin ich die Einbettung von flash mit SWFObj:
<div id="flash_content">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1280" height="800" id="tourFlash" name="pano" class="pano">
<param name="movie" value="VRDemo.swf" />
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="VRDemo.swf" width="1280" height="800" class="pano">
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<param name="allownetworking" value="all" />
<param name="flashvars" value="zoom=null&pan=null&sound=null" />
<!--<![endif]-->
<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>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
<script>
var flashObj;
$(document).ready(function(){
flashObj = document.getElementById('tourFlash');
$('#interface').click(function(){
console.log('click');
talkToFlash();
});
});
function talkToFlash(){
flashObj.listenToJS('hello from js');
}
function listenFromFlash(flashMessage){
console.log(message);
}
</script>
Den click-handler ausgelöst wird, aber hier bekomme ich die Fehlermeldung. Meine flash-Datei verwendet eine Dokument-Klasse, und in der Dokument-Klasse ist die öffentliche Funktion. Flash ist wie folgt aufgebaut:
package com.company.vr {
import flash.display.*;
import flash.events.*;
import com.greensock.*;
import com.greensock.easing.*;
import flash.external.ExternalInterface;
import flash.system.Security;
Security.allowDomain("*");
public class VR_TestDocument extends MovieClip {
public function VR_TestDocument() {
ExternalInterface.addCallback("talkToFlash", listenToJS);
}
public function listenToJS(message){
trace ("from js: " + message);
var flashMessage = message + " flash";
ExternalInterface.call("listenFromFlash", flashMessage);
}
}
}
- - - - UPDATE---
Sieht es aus wie Externe Interface nicht so wie SWFObject aus irgendeinem Grund. Wenn ich auf die Methode der Einbettung von Flash in diesem Beispiel verwendet:
funktioniert es, aber ich fühle mich wie swfobject ist der beste Weg, um flash einbetten. Hat jemand irgendwelche Ideen?
InformationsquelleAutor mheavers | 2013-01-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie embeded flash in html als code oben, beachten Sie, dass der zweite tag Objekt hat auch zu enthalten-Attribut id, korrigierte code ist hier:
Aber natürlich, swfobject ist der beste Weg, um flash einbetten. Korrekter html-code sieht wie folgt aus:
--Update--
Wählen Sie die richtige flash-element auf der Seite. (Abhängig vom browser). Als Beispiel ist hier code ein, um den richtigen flashObj:
Ich habe gerade getestet, von Ihnen angegebene generator. Wenn ich die Satz-id für den zweiten tag <object> und entfernen Sie die gleichen aus der ersten - es funktioniert, probieren Sie es.
Aber ich empfehle die Verwendung swfobject.embedSWF() - flexibler. swfobject.js u cad-downlod von hier aus link
verwenden swfobject.getObjectById (), wenn statische veröffentlichen. Keine Notwendigkeit, fügen Sie die ID in das verschachtelte Objekt
Was ist das die Rede, dass mit zu auch weisen Sie die gleiche id für das innere object-element? Können Sie weiter erklären, das Ding. Darf nicht alle Elemente in den DOM - eindeutige ids? - w3.org/TR/html4/struct/global.html#h-7.5.2 - w3.org/html/wg/drafts/html/master/dom.html#the-id-attribute
InformationsquelleAutor Serge Him
Könnte es sehr wohl ein timing-Problem -- Flash-Player benötigt etwas Zeit zum initialisieren ExternalInterface, und dann ein bisschen mehr Zeit, laden Sie Ihre SWF. Dein Beispiel-code ausgeführt wird, auf DOMReady, das ist KEINE Garantie, dass die SWF geladen wurde, die ExternalInterface-Initialisierung in den Flash-Player.
Empfehle ich die Abfrage des SWF zu sehen, wenn es fertig geladen ist. Es gibt dazu ein Beispiel (mit dynamic publishing) LearnSWFObject.com: http://learnswfobject.com/advanced-topics/executing-javascript-when-the-swf-has-finished-loading/
UPDATE:
Nach re-Lektüre Ihrer code und einige andere antwortvorgaben, bemerkte ich, bist du mit
document.getElementById
schnappen Sie sich Ihre<object>
. Bei der Verwendung der geschachtelten<object>
markup, das funktioniert nicht (außer im IE, welche mit der äußeren<object>
).swfobject.getObjectById
wurde speziell erstellt, um dieses Problem zu beheben. Versuchen Sie, Bearbeiten Sie Ihre JS zu verwendenswfobject.getObjectById
.Theoretisch, ja. Zum Beispiel könnten Sie einen link erstellen, ruft Ihr ExternalInterface, dann warten, bis die SWF zu laden, bevor Sie auf die Verknüpfung klicken. Wenn Ihr ExternalInterface funktioniert, dann wissen Sie, dass Sie ein timing-Problem. Wenn es nicht funktioniert, können wir nach anderen Ursachen suchen.
InformationsquelleAutor pipwerks