Развертывание массива ... args в вызове функции - PullRequest
3 голосов
/ 13 декабря 2010

Я делаю многочисленные вызовы ExternalInterface для методов JavaScript и у меня есть вспомогательная функция для этого:

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

Однако это означает, что методу JavaScript будет передан только один аргумент - массив аргументов - это означает, что я должен изменить JavaScript, чтобы приспособиться к этому, например, вместо:

function example(argument1, argument2)
{

}

Я получаю:

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

Я хотел бы развернуть массив аргументов, передаваемый методу JSCall, чтобы каждый аргумент передавался индивидуально в вызов ExternalInterface, например:

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

работает как:

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

Ответы [ 3 ]

3 голосов
/ 06 апреля 2012

Чтобы вызвать функцию javascript из flash с несколькими аргументами, все, что вам нужно сделать, это:

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

Если вы берете аргументы из списка переменных аргументов другой функции, вы можете использовать:

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);
}

Где-то еще вы бы позвонили:

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

... что напечатало бы что-то вроде Testing 123 true Object на вашей консоли firebug / webkit.

Это проверено и работает точно, так как я использую его в реальном проекте.

2 голосов
/ 13 декабря 2010

Эй, Кэмерон, ты пробовал использовать Function.apply ()?Попробуйте это:

ExternalInterface.call.apply( methodName, args );

Это так безумно, это может сработать!

0 голосов
/ 15 декабря 2010

В JavaScript это Function.call.apply(foo, [that, test, bla]) работает как foo.call(that, test, bla), но поскольку ExternalInterface.call не равно Function.prototype.call, нам нужно использовать другой подход.

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

Примечание: я не проверялэто в ActionScript.

...