externe Schnittstelle und swfobject.js Problem
Vor einigen Monaten für ein Projekt bei der Arbeit entwickelte ich einen video-player mit flash, externe Schnittstelle und swfobject.js. Ich verwendete externe Schnittstelle für die Kommunikation zwischen javascript und actionscript. Dies funktioniert Super. Derzeit arbeite ich an einer Erweiterung dieser, die mich verpflichtet zu extrapolieren Logik von dem, was ich bereits geschrieben. Ich bin mit die gleiche swf-Datei in beiden Anwendungen, aber in der Verlängerung, die ich nicht bekommen kann das flash-Objekt zu erkennen, auf meine Anrufe. Da ich die gleiche swf-Objekt, ich weiß, dass mein problem liegt in javascript, ich weiß nur nicht wo. Ich bin mit der JQuery-Bibliothek. Ohne weitere adieu, hier mein code.
Unten in meiner js-Datei habe ich Folgendes stehen:
$(function(){
//the video player shouldn't be built until the user presses the div with 'video-btn' class
$('.video-btn').click(function(){
var videoplayer = new VideoPlayer();
videoplayer.addVideoPlayer();
//external interface function
videoplayer.player.loadVideo();
});
});
Hier ist die definition für VideoPlayer.addVideoPlayer()
- und es ist relevant, helper-Funktionen:
//inside of VideoPlayer object definition
this.addVideoPlayer = function(){
var that = this;
$('body').append('<div id="no-flash"></div>');
//uses swfobject.js to replace the div i just appended with the flash object
//This works fine. the flash object replaces the div as intended
that.embedFlashObject();
//that.player is (supposed to be) a reference to flash object
that.player = that.getFlashObject();
};
this.embedFlashObject = function(){
var that = this;
//set up all the variables to pass to swfobject.embedSWF
//this method removes my div and replaces it with an object element that contains the swf file
//the object tag gets an id which is specified. Let's assume it's 'vp'
swfobject.embedSWF(swfFile, 'no-flash', width, hieght, '9.0.0', ... );
};
this.getFlashObject = function(){
var that = this;
//this method returns the flash object to make external interface calls on
//this the method prescribed by swfobject api
var videoObj = swfobject.getObjectById('vp');
if(typeOf videoObj == 'undefined')
{
//check if useragent string is IE
var isIE = navigator.userAgent.match(/MSIE/i);
videoObj = isIE ? window['vp'] : document['vp'];
}
return videoObj;
};
In meinem $(function(){..});
block, wenn der Befehl 'videoplayer.player.loadMedia();
' bekomme ich eine Fehlermeldung, die liest
.loadMedia ist nicht eine Funktion.
In der vorherigen version des Projektes (in dem ich die genau die gleiche swf-Datei), erhalte ich nicht diesen Fehler.
Ich nicht glaube, ich bin fehlen alle schweren logischen Fehler, und ich weiß, das ist schwer zu sagen, definitiv 'das ist dein Problem....' bei der Betrachtung abgekürzt und geschrubbt code. Statt eine eindeutige Antwort nehme ich Vorschläge, wie man diese debug-Ausgabe. Ich habe das Spiel aorund in die browser-Konsole und ich habe festgestellt, dass die 'Spieler' - Attribut des VideoPlayer-Objekts null ist. Bei mir lief die gleiche Konsole Abfrage gegen die funktionierende version von diesem Projekt-es spuckt wieder das object-tag. Ich kann nicht direkt auf das Objekt-tag, denn es bricht mit den Konventionen, die in der vorherigen version die ich brauche, um zu warten.
HELFEN!!!!!!!!!!!!!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
SWFObject Callback-Funktion
Bitte gehen Sie durch die Dokumentation von SWFObject.
https://code.google.com/p/swfobject/wiki/api
Alle Funktionen, die für die Erstellung oder die SWF hat eine callback-parameter. Übergeben Sie eine callback-Funktion als parameter, die aufgerufen werden, wenn die SWF-Datei bereit.
Aufrufen Ihrer ExternalInterface actionscript-Funktion in dieser callback-Funktion.
Beispiel:
So, ich habe herausgefunden, was mein problem war. Trotz meiner Bemühungen, robust sein, Beschreibung des Problems, ließ ich einen Schlüssel der Tat, das hätte wahrscheinlich geholfen, zu lösen mein Problem. War ich entwickle meine Anwendung lokal, bevor Sie zu einer tatsächlichen Entwicklungs-server. Bei Verwendung einer flash-Anwendung im lokalen Kontext, die Kommunikation aus dem internet sind standardmäßig deaktiviert. Wenn Sie google "adobe Sicherheits-Einstellungen', einer der top-links werden Sie auf eine adobe-Sicherheits-Einstellungen-Seite, wo Sie cchose Ordner auf Ihrem lokalen Computer aus, die Sie zulassen möchten, dass dieser externe Kommunikation. Meine swf-Datei versucht, früh auf, um eine Verbindung zu unseren Servern vor der Initialisierung des externen call-backs, wenn es das nicht kann, es wartet einfach nur, und damit keine von meine Funktionen waren immer deklarierte Funktionen. Eigentlich hatte ich dieses problem bei der Arbeit durch meine erste iteration des Projektes, aber nicht daran gedacht, bis gestern.
Danke für alle, die gelieferten Lösungen. Nachdem dies zweimal getan ich kann für die Tatsache bürgen, dass alles, was vorgeschlagen wurde, hier ist etwas, das könnte halten eine person beim Versuch, das Programm und die externe Schnittstelle flash-Anwendung.
Gibt es eine Reihe von möglichen Ursachen. Eine der häufigsten ist timing-wenn Sie versuchen, Zugriff auf ExternalInterface, bevor die SWF-Datei bereit, Sie auf einen Fehler stoßen.
Reihenfolge der Ereignisse:
<object>
auf der SeiteWenn Sie versuchen, berufen sich auf die ExternalInterface-Methode sofort nach der Verwendung von SWFObject, die Schritte 2 bis 4 möglicherweise noch nicht abgeschlossen haben, noch, die würde werfen ein JS-Fehler (Methode nicht gefunden).
In diesen Fällen möchten Sie vielleicht zu Experimentieren mit einem timer, um zu sehen, ob es Veränderungen Ihren Ausgang. Hier ist ein Beispiel, das Sie verwenden können.
Außerdem bemerkte ich einige Elemente im code, die vereinfacht werden könnten oder bearbeitet werden, sind hier einige Vorschläge:
embedFlashObject
:hieght
sollteheight
getFlashObject
verwendetswfobject.getObjectById
; dies ist nicht erforderlich,swfobject.getObjectById
ist nur erforderlich, wenn Sie mit SWFObject statische publishing-Technik. Wenn Sie mit dynamic publishing können Sie nur verwendendocument.getElementById
oder jQuery$
Funktion.getFlashObject
hat einen Scheck für den IE. Sie können SWFObject istua
- Eigenschaft, um die Informationen, zu:swfobject.ua.ie
im Ortnavigator.userAgent.match(/MSIE/i)
swfobject.createSWF
zurückkehren können, einen Verweis auf das neu erstellte<object>
, so dass Sie möglicherweise in der Lage sein, um Ihren code zu vereinfachen.Werden könnte, verdichten sich zu
Dies würde die Notwendigkeit beseitigen für Ihre
embedFlashObject
undgetFlashObject
Methoden.Ich fühle deinen Schmerz. Ich kämpfte mit diesem für eine lange Zeit mit mir selbst...
Wenn man einen "keine Funktion" angezeigt wird, im Grunde, was passiert ist, dass entweder:
a) Ihr javascript kann nicht finden, Ihre Film-Instanz.
oder
b) Ihr actionscript-Code ist nicht richtig freilegen der loadMedia () - Methode.
Es ist immer eine gute Idee, check () - Methoden in Ihre js und Ihr als. Sie werden verwendet, um sicherzustellen, dass jedes element vollständig geladen ist und bereit ist, für manipulation/Nutzung. Es gibt eine Reihe von posts über diesem.
Haben Sie bemerkt, einen Unterschied zwischen IE und Firefox? Arbeitet man, aber die anderen nicht?
In den folgenden block:
...Sie scheinen mit swfObject-Methode zum abrufen der Film, aber dann sind Sie die überprüfung der browser-und - WIEDER - Blick in den DOM für den Film. Haben Sie versucht, das auskommentieren der folgenden block:
...und einfach nur wieder das swfobject zurückgegebene Wert?
Wie ich es verstehe, swfObject mit der browser-Erkennung für Sie.
Überprüfen Sie auch, ob swfobject ist tatsächlich das html-Objekt eine id ('vp').
FF Sie benötigen, um Ihren code in ein embed-element für die korrekte Ausführung der ExternalInterface-und eigentlich denke ich, dieser code wird nicht unterstützt swfobject.js. Um zu arbeiten benötigen Sie auch eine classid wie das vollständige Beispiel (http://code.google.com/p/flash-videoio/source/browse/trunk/examples/ichatnow/index.html)