2012-06-15 41 views
0

執行事件偵聽時,我有下面的代碼使用ActionScript和InDesign的SDK:的ActionScript錯誤在JavaScript

在我的課

[ 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

inside afterImport()你有訪問test()函數嗎?意思是你可以調用函數afterImport(document){asInterface.test();}? –

+0

是的,測試函數得到正確執行,當測試函數完成後,它會跳回到jsxInterface.afterImport(document); 功能,那就是我得到的錯誤 – vincent

回答

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

我刪除了括號,但錯誤仍然存​​在。 – vincent

+0

我編輯了我的答案,包含一些可以嘗試調試的代碼。 –

0

我認爲你必須啓動AS包裝是這樣的:

jsxInterface.init(this); 

則AS API可用於js代碼。

Loic