2010-12-13 3 views
3

Je fais de nombreux ExternalInterface appels aux méthodes JavaScript et ont une fonction d'aide pour le faire:Déroulant un ... tableau args dans un appel de fonction

protected function JSCall(methodName:String, ...args):void 
{ 
    try 
    { 
    ExternalInterface.call(methodName, args); 
    } 
    … etc … 
} 

Cependant cela signifie que la méthode JavaScript ne sera passé un argument - le tableau d'arguments - ce qui signifie que je dois modifier le JavaScript pour y répondre, par exemple au lieu de:

function example(argument1, argument2) 
{ 

} 

je me retrouve avec:

function example(args) 
{ 
    var argument1 = args[0]; 
    var argument2 = args[1]; 
} 

Ce que j'aimerais faire est Déroulez le tableau d'arguments étant transmis à la méthode JSCall de telle sorte que chaque argument est transmis individuellement au ExternalInterface appel, tel que:

JSCall('example', ['one', 'two']) 

fonctionne comme:

ExternalInterface.call('example', 'one', 'two') 

Répondre

2

Hey Cameron, avez-vous essayé d'utiliser Function.apply()? Essayez ceci:

ExternalInterface.call.apply(methodName, args); 

C'est tellement fou, ça pourrait marcher!

+1

Cela fonctionne en effet, c'est ingénieux bidouille, je l'ai moi-même utilisé plusieurs fois maintenant, semble étrange et 90% des gens ne le comprennent pas quand ils le voient pour la première fois mais bon c'est génial! –

+0

Salut Mims/Ivo, malheureusement, alors que cela ne provoque pas d'erreurs Flash de compilation/exécution, il soulève des erreurs JavaScript lors de l'exécution de l'appel EI. @Ivo - avez-vous un vrai exemple d'utilisation de cette technique? –

+0

En regardant la documentation de l'API pour apply(), je peux voir comment ce qui suit fonctionnerait: 'ExternalInterface.call.apply (null, [nom de la méthode, args])' mais c'est la même chose que directement en utilisant ExternalInterface.call qui doesn ' –

0

En JavaScript ce Function.call.apply(foo, [that, test, bla]) fonctionne comme mais puisque ExternalInterface.call n'est pas égal à Function.prototype.call nous devons utiliser une approche différente ici.

// Let's fake ExternalInterface 
var funcs = { 
    example: function(arg1, arg2) { 
     console.log(arg1, arg2); 
    } 
}; 

var ExternalInterface = {}; 
ExternalInterface.call = function() { 
    var f = funcs[arguments[0]]; 
    f.call.apply(f, arguments); 
} 


// This does crazy stuff. 
function JSCall(func, args) { 
    args.unshift(func); 
    ExternalInterface.call.apply(ExternalInterface, args); 
} 

// These do the same now 
ExternalInterface.call('example', 'one', 'two'); // one two 
JSCall('example', ['one', 'two']); // one two 

Remarque: Je n'ai pas testé cela dans ActionScript.

3

Pour appeler une fonction javascript de flash avec de multiples arguments, tout ce que vous avez à faire est:

ExternalInterface.call.apply(null, [functionName, arg1, arg2, ..., argn]); 

Si vous prenez les arguments d'une liste variable d'arguments d'une autre fonction, vous pouvez utiliser :

function JSCall(methodName:String, ...args):void 
{ 
    if (ExternalInterface.available){ 
     args.unshift(methodName); 
     ExternalInterface.call.apply(null, args); 
    } 

    //btw, you can do the same with trace(), or any other function 
    args.unshift('Calling javascript function'); 
    trace.apply(null, args); 
} 

Quelque part d'autre que vous appelez:

JSCall('console.log', 'Testing', 123, true, {foo:'bar'}); 

... wh Je voudrais imprimer quelque chose comme Testing 123 true Object sur votre console firebug/webkit.

Ceci est testé et fonctionne à coup sûr, car je l'utilise dans un vrai projet.

Questions connexes