0

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

4

2 回答 2

1

问题似乎是在您的afterImport()方法中,您错误地添加了事件侦听器。

addEventListener()方法的第二个参数应该是函数的名称(从技术上讲,它是对函数的引用)。在您的代码中,您在函数名称的末尾放置了括号——因此,不是提供对函数的引用,而是正在执行该函数。

当函数执行时,它什么也不返回,所以第二个参数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);
    }
于 2012-06-15T11:41:41.720 回答
0

我认为您必须像这样启动 AS 包装器:

jsxInterface.init( this );

然后 AS API 可用于 js 代码。

洛伊克

于 2012-06-15T20:36:51.523 回答