我正在对JavaScript方法进行大量的ExternalInterface调用,并且有一个辅助函数来执行此操作:
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')
答案 0 :(得分:3)
要从具有多个参数的flash调用javascript函数,您所要做的就是:
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'});
...会在你的firebug / webkit控制台上打印Testing 123 true Object
之类的内容。
这是经过测试并确实有效,因为我在一个真实的项目中使用它。
答案 1 :(得分:2)
嘿Cameron,你尝试过使用Function.apply()吗?试试这个:
ExternalInterface.call.apply( methodName, args );
这太疯狂了,它可能会奏效!
答案 2 :(得分:0)
在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中测试过这个。