Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-03-2011, 15:36   #1 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 22
ExternalInterface.call mit Argument klappt nicht

Hallo liebes Forum!

Ich möchte aus einer SWF-Datei eine JavaScript-Funktion aufrufen und ihr ein Argument übergeben.
Das Argument soll in meinem Fall ein Object einer eigenen ActionScript-Klasse sein.
Leider funktioniert das nicht. Mein Versuch sieht so aus:

Die JavaScript-Funktion ist im Moment nur ein Platzhalter.
Code:
function test(foo)
{
    alert(foo);
}
Wenn ich an die Funktion einen String schicke, wird dieser auch ausgegeben.

Code:
if (ExternalInterface.available)
{
    ExternalInterface.call('test', 'foobar');    // alert('foobar');
}
Wenn ich ein Objekt an die Funktion schicke, gibt mir die Fehlerkonsole des Firefox einen internen Fehler - soweit ich das beurteilen kann - und sonst wird mir nichts angezeigt:

Code:
var foobar:_meineKlasse = new _meineKlasse([...]);    // _meineKlasse extends MovieClip

if (ExternalInterface.available)
{
    ExternalInterface.call('test', foobar);

/*
******************************************************
FF-Fehlerkonsole
******************************************************
Fehler: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMEventTarget.removeEventListener]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: file:///C:/******************/Mozilla/Firefox/Profiles/na3bnfci.default/extensions/%7Bd10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d%7D/modules/ObjectTabs.jsm :: anonymous :: line 343"  data: no]
Quelldatei: file:///C://******************/Mozilla/Firefox/Profiles/na3bnfci.default/extensions/%7Bd10d0bf8-f5b5-c8b4-a8b2-2b9879e08c5d%7D/modules/ObjectTabs.jsm
Zeile: 343
********************************************************
*/
}
Ich finde auch interessant, dass dieser Fehler ausgelöst wird bevor ich den Button drücke, der die JavaScript-Funktion aufrufen soll.

Ich hoffe, ich konnte mein Problem beschreiben.
Könnte mir bitte jemand helfen oder weiß jemand Rat?

Herzlichen Dank,
Helen
HelenInTrouble ist offline   Mit Zitat antworten
Alt 08-03-2011, 15:42   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Was soll den JavaScript mit diesem MovieClip anfangen?

Laut Referenz ist es zwar möglich beliebige Typen zu übergeben...
Zitat:
... arguments — Die Argumente, die für die Funktion im Container übergeben werden. Sie können beliebig viele durch Komma getrennte Parameter angeben. Diese können einen beliebigen ActionScript-Datentyp aufweisen. Beim Aufrufen einer JavaScript-Funktion werden die ActionScript-Datentypen automatisch in JavaScript-Typen konvertiert. Bei anderen ActiveX-Containern werden die Parameter in der Anforderungsmeldung kodiert.
...allerdings kann ich mir nicht vorstellen, was man in JS mit so einem konvertierten MovieClip anstellen möchte?

Sinn manchen da IMHO nur einfache Typen, wie String, Number oder bestenfalls ein Array:
PHP-Code:
ExternalInterface.call('test'String(foobar)); 
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (08-03-2011 um 15:45 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-03-2011, 16:23   #3 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 22
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Was soll den JavaScript mit diesem MovieClip anfangen?

Laut Referenz ist es zwar möglich beliebige Typen zu übergeben......allerdings kann ich mir nicht vorstellen, was man in JS mit so einem konvertierten MovieClip anstellen möchte?
Ich weiß es nicht, ich wüsste nichtmal wie ein MovieClip entsprechend JS-konvertiert aussehen soll. Daher der Versuch. Idealerweise, könnte ich per JS die öffentlichen Eigenschaften des Objekts auslesen. Das war zumindest mein Test.

Wenn man der Funktion ein Array übergeben kann/können soll, sollte es auch mit primitiven Objekten als assoziative Arrays funktionieren. Gibt es damit Erfahrungen? Gibt es Beispiele für Arrays? Google hat mir spontan nicht so viel brauchbares ausgespuckt.
HelenInTrouble ist offline   Mit Zitat antworten
Alt 08-03-2011, 16:30   #4 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von HelenInTrouble Beitrag anzeigen
Idealerweise, könnte ich per JS die öffentlichen Eigenschaften des Objekts auslesen. Das war zumindest mein Test.
Und was sollte JS dann damit anfangen!? Sorry, aber ich kann mir wirklich keinen Fall vorstellen, in dem sowas Sinn machen würde...
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-03-2011, 16:41   #5 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 22
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Und was sollte JS dann damit anfangen!? Sorry, aber ich kann mir wirklich keinen Fall vorstellen, in dem sowas Sinn machen würde...
Die Kommunikation zwischen den Schnittstellen ist doch interessant.
Man könnte die Eigenschaften eines Objekts mit JS abfangen, zum Server schicken, dort verarbeiten und das Ergebniss wieder in der swf weiter nutzen.
Oder man schickt direkt ein Objekt zum Server und verarbeitet dessen Eigenschaften. Warum soll das nicht nützlich sein?

€: ein einfaches Beispiel wäre vllt. ein simples Multiplayer-Spiel bei dem jede Spielerfigur als Objekt gesehen wird und deren Eigenschaften auf dem Server gespeichert werden. Ich hab allerdings nichts in der Richtung vor, es ging mir nur um den Test und die Frage warum es nicht funktioniert.

Geändert von HelenInTrouble (08-03-2011 um 16:44 Uhr)
HelenInTrouble ist offline   Mit Zitat antworten
Alt 08-03-2011, 16:55   #6 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Damit, dass es grundsätzlich interessant wäre, mal zu schauen, was da in JS ankommt, hast Du sicher recht.

Aber ich halte es nicht für sinnvoll dies zu nutzen um z.B. die Server-Kommunikation durch JS zu schleifen (dort müsst die Daten ja abermals serialisiert werden), statt sie direkt in AS (z.B. via amfPHP) durchzuführen.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 09-03-2011, 08:14   #7 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 22
Question

Also ich habe ein bisschen damit rumgespielt weil ich doch gern ein paar Daten per JS verarbeiten möchte.

Dazu habe ich geschaut ob und was bei JS alles ankommt.
Mein Versuch sieht so aus:

Code:
var testArray:Array = new Array();

// test mit String
testArray['test1'] = 'test1';

// test mit primitivem Objekt
testArray['test2'] = {foo:'bar', bla:'blub'};

// test mit verschachtelten "Arrays"
testArray['test3'] = new Array();
testArray['test3']['foo'] = new Array()
testArray['test3']['foo']['bar'] = 'foobar';
Das ergibt in ActionScript:
Code:
testArray(object)
    // Test 1
    test1(string) -> "test1"

    // Test 2
    test2(object)
        foo(string) -> "bar"
        bla(string) -> "blub"

    // Test 3
    test3(object)
        foo(object)
            bar(string) -> "foobar"
Jetzt versuche ich das Objekt mit JS abzufangen.
Dazu mein Test-Skript:
Code:
function jsTest(obj)
{
	alert(typeof obj);
	for (s in obj)
	{
		alert(s);
	}
}
Jetzt schicke ich das Objekt an JS:
Code:
if (ExternalInterface.available)
{
    ExternalInterface.call('jsTest', testArray);
}
Als JS-Alert erhalte ich nur "object". Es scheint also ein leeres Objekt zu sein.
Die FF-Fehlerkonsole zeigt wieder den Fehler den ich weiter oben schon zitiert habe.

Ich konnte das Problem auf den 3. Test eingrenzen.
Mein Versuch war
Code:
if (ExternalInterface.available)
{
    ExternalInterface.call('jsTest', testArray['test1'], testArray['test2'], testArray['test3']);
}
Die Werte in testArray['test1'] und testArray['test2'] konnte ich in JS problemlos ansprechen. testArray['test3'] liefert wieder das leere Object und die Meldung in der FF-Fehlerkonsole.

Wie kann ich ein verschachteltes Array/Objekt an JS übergeben?

Eine Idee?
HelenInTrouble ist offline   Mit Zitat antworten
Alt 09-03-2011, 11:39   #8 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 22
Ok, wenn man die Objekte auch als Objekte deklariert funktioniert es fast fehlerfrei.

Code:
var testArray:Array = new Object();

// test mit String
testArray['test1'] = 'test1';

// test mit primitivem Objekt
testArray['test2'] = {foo:'bar', bla:'blub'};

// test mit verschachtelten "Arrays"
testArray['test3'] = new Object();
testArray['test3']['foo'] = new Object()
testArray['test3']['foo']['bar'] = 'foobar';
"Fast" deshalb, weil die Fehlerkonsole immernoch diesen merkwürdigen Fehler anzeigt.

Weiß da jemand Rat?
HelenInTrouble ist offline   Mit Zitat antworten
Alt 09-03-2011, 11:46   #9 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Ich hab' mir die Fehlermeldung noch mal angesehn und festgestellt, dass sie scheinbar in irgendeine Firefox-Extension auftritt und damit eigentlich nichts mit Deinem Script zutun hat.

Deaktiviere mal der Reihe nach Deine AddOns, um so den Verursacher zu identifizieren!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (09-03-2011 um 11:49 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 09-03-2011, 11:58   #10 (permalink)
Neuer User
 
Registriert seit: Aug 2010
Beiträge: 22
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Deaktiviere mal der Reihe nach Deine AddOns, um so den Verursacher zu identifizieren!
Ist einen Versuch wert. Allerdings glaube ich schon, dass es in irgendeiner Form mit meinem Script zu tun hat. Der Fehler tritt ja nur auf wenn ich das verschachtelte Objekt an JS schicke.

Vielleicht finde ich durchs deaktivieren der AddOns noch was raus.

€: ich habe alle AddOns deaktiviert und der Fehler war tatsächlich weg. Ich habe anschließend AdBlock Plus wieder aktiviert und der Fehler trat wieder auf. Jetzt habe ich nicht weiter getestet, ob der Fehler nur am AdBlock Plus liegt oder bei "irgendeinem" AddOn. Es beruhigt mich aber, dass es scheinbar doch nichts mit meinem Code zu tun hat.

Danke für den Hinweis!

Noch eine andere Frage die bei mir aufgekommen ist. Was genau ist amfPHP? Kannst du mir da ein paar Stichworte oder Praxisbeispiele geben? Das sagt mir nämlich noch gar nichts.

Geändert von HelenInTrouble (09-03-2011 um 12:09 Uhr)
HelenInTrouble ist offline   Mit Zitat antworten
Alt 09-03-2011, 12:17   #11 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von HelenInTrouble Beitrag anzeigen
Was genau ist amfPHP?
Eine Schnittstelle zwichen PHP und AS3: Flash remoting for PHP: A responsive Client-Server Architecture for the Web

Zitat:
Zitat von HelenInTrouble Beitrag anzeigen
Kannst du mir da ein paar Stichworte oder Praxisbeispiele geben? Das sagt mir nämlich noch gar nichts.
Unter dem Stichwort "amfPHP" dürftest Du hier im Forum und über Google eigentlich genügend Informationen finden...
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
externalinterface.call, javascript

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Switch case : externalInterface.call geht nicht SteveDragon ActionScript 3 2 12-02-2011 11:03
Variablenübergabe mit ExternalInterface.call geht offline aber nicht online Adlerhorst ActionScript 3 0 29-03-2010 19:43
ExternalInterface.call geht nicht!?? stylefetish ActionScript 3 3 13-03-2009 17:33
ExternalInterface.call funktioniert nicht!!! eyeffect Flash 8 0 07-01-2007 12:03
As 2 JS Problem: getURL() und ExternalInterface.call() funktionieren nicht eyeffect Flash 8 0 06-01-2007 19:20


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele