在javascript中执行eventlistener时出现Actionscript错误

时间:2012-06-15 09:46:28

标签: javascript actionscript-3 sdk adobe-indesign

我有以下代码使用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。有人可以帮我解决这个问题吗?

2 个答案:

答案 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代码。

卢瓦克