我有以下代码使用actionscript和indesign sdk:
在我班级的开头
[ Embed (source= "resources/js/eventHandlers.jsx" , mimeType= "application/octet-stream" )]
private static var jsHandler:Class;
var jsxInterface:HostObject = HostObject.getRoot(HostObject.extensions[0]);
在我的职能中:
jsxInterface.eval( new jsHandler().toString());
jsxInterface.init( this );
document.xmlElements.item(0).xmlElements.item("docpreset").importXML(File.applicationStorageDirectory.resolvePath("temp/cstyles.xml"));
jsxInterface.afterImport(document);
这是eventHandlers.jsx中的代码:
var asInterface = {};
function init(wrapper) {
asInterface = wrapper;
}
function afterImport(document) {
document.addEventListener (Document.AFTER_IMPORT, asInterface.test());
}
从javascript我称之为:
public function test():void {
trace("ole");
}
现在,测试函数正确执行,但之后接下来要调用的是:
jsxInterface.afterImport(document);
然后抛出错误:
Error: ActionScript error: Error: Missing required parameter 'handler' for method 'addEventListener'.
我不知道自己需要做什么。我想要的只是导入xml并在导入完成时调度一个事件。
我不知道为什么我甚至不得不调用javascript函数,并且不能在正常的eventListener中使用document.AFTER_IMPORT。有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
问题似乎是在afterImport()
方法中,您错误地添加了事件侦听器。
addEventListener()
方法的第二个参数应该是函数的 name (技术上它是对函数的引用)。在您的代码中,您已将括号放在函数名的末尾 - 因此,不是提供对函数的引用,而是正在执行该函数。
当函数执行时,它不返回任何内容,因此缺少addEventListener()
的第二个参数,您将收到错误。
请改为尝试:
function afterImport(document) {
document.addEventListener (Document.AFTER_IMPORT, asInterface.test);
// notice no "()" here ^^
}
<强> [编辑] 强>
由于您仍然收到错误,您可能需要添加一些代码以进一步调试它。
在上面的方法中,注释掉addEventListener行,并用以下内容替换:
// for debugging
if (asInterface.test == null)
{
trace("fail: it's null");
}
else if (asInterface.test is Function)
{
trace("success: it's a function");
// this is the only code path where your error will not occur
}
else
{
trace("fail: i don't know what this is: ", asInterface.test);
}
答案 1 :(得分:0)
我认为你必须像这样启动AS包装器:
jsxInterface.init( this );
然后AS API可用于js代码。
卢瓦克