2015-05-13 49 views
0

我正在使用Adobe Flash Builder 4.6中的InDesign CS6扩展。由于某种原因,我的代码(工作很长时间)现在会抛出错误null is not an object。该错误是位于JavaScript注入(最后一行):在ActionScript中调试JavaScript注入(Flash Builder)

public class Script { 
    private static var _instance:Script; 

    [ Embed (source="script.jsx", mimeType="application/octet-stream") ] 
    private var ScriptClass:Class; 
    private var jsxInterface:HostObject; 

    public function Script() { 
     if (Script._instance) { 
      throw new Error("only single instance allowed"); 
     } 
     Script._instance = this; 
     this.init(); 
    } 

    public static function getInstance():Script { 
     return _instance; 
    } 

    private function init():void { 
     Log.log("HostObject.mainExtension: "+HostObject.mainExtension); 
     for each (var s:String in HostObject.extensions) { 
      Log.log("Extension: "+s); 
     } 

     this.jsxInterface = HostObject.getRoot(HostObject.mainExtension); 
     this.jsxInterface.eval(new ScriptClass().toString()); 
    } 

    public function getScript(name:String):Object { 
     return this.jsxInterface[name]; 
    } 

    public function exec(name:String, args:Array = null):Object { 
     return InDesign.app.doScript(
      this.jsxInterface[name], ScriptLanguage.javascript, args, UndoModes.AUTO_UNDO); // <-- this is where the error appears 
    } 

心中已经检查InDesign.app.doScript的参数为空,但一切正常。这是被调用的函数(内部script.jsx):

function prepareForImageExport(params) { 
    var pageItem = params[0]; 
    var prefix = params[1]; 
    var bounds = params[2]; 
    var ax = params[3]; 
    var ay = params[4]; 

    pageItem.visible = true; 

    // create tmp container 
    var container = app.activeDocument.rectangles.add(app.activeDocument.activeLayer); 

    container.name = prefix+container.id; 
    container.geometricBounds = bounds; 
    container.strokeWeight = 0; 
    container.strokeColor = app.activeDocument.swatches.item("None"); 
    container.fillColor = app.activeDocument.swatches.item("None"); 
    container.visible = true; 
    container.transparencySettings.blendingSettings.opacity = 100; 

    // create a duplicate of the pageItem in the tmp container 
    var copyItem = pageItem.duplicate(app.activeDocument.activeLayer); 
    copyItem.transparencySettings.blendingSettings.opacity = 100; 
    copyItem.locked = false; 
    container.geometricBounds = bounds; 
    container.move([ax,ay]); 
    copyItem.visible = true; 

    app.select(copyItem); 
    app.cut(); 
    app.select(container); 
    app.pasteInto(); 

    app.scriptArgs.setValue("container", container.name); 
} 

在这个地方我卡住了。我不知道该错误出现在哪一行。

我对ActionScript很新,我似乎无法找到关于如何在ActionScript中调试Javascript注入的文档。此外,我不知道,哪些变量(如应用程序)可以在JavaScript代码中访问,哪些(如控制台 - 我不能写console.log)不是。

任何帮助,非常感谢!

回答

0

您应该首先尝试检查发送给javascript的参数/ params是否有效(并非null或未定义) 之后尝试记录JS代码中的每一行以查看它崩溃的位置,我不知道如何JS代码在你的情况下执行(我没有做扩展),但如果它使用HtmlLoader,那么你可以访问加载器的窗口对象并添加一个日志功能或具有日志功能的控制台对象。

+0

我已经检查过null。 HtmlLoader没有工作,我重写了Actionscript中的JavaScript代码。 –

0

如果返回的是有效对象,请先检查this.jsxInterface。您可以使用debug作为模式并在那里设置断点。然后看看this.jsxInterface [name]。

自从几年以来,我没有做任何扩展,但jsxInterface应该可以在没有“this”的情况下访问。因为你将它设置为上面的变量。

对于它的价值,我不会尝试在Flex Builder中调试js代码。你可以做的是使用日志功能(http://debrouwere.github.io/Extendables/docs/packages/logging/doc/readme.html),然后看看你从Flex收到什么。请注意,当您传递Flex对象时,您实际上会在ExtendScript上下文中接收Flex对象。

但简而言之,你的错误意味着你正试图使用​​一个不存在的对象(在我的愚见中为this.jsxInterface)。也许你的代码很好,也许参数太多,但问题应该位于inbetweens之间。

对于Flex日志记录,您可以使用“trace()”,但需要处于调试模式。

+0

感谢您的回答,不幸的是它没有帮助。我将javascript代码换成了actionscript并遇到了一个新问题:http://stackoverflow.com/questions/30322899/random-errors-in-actionscript-memory-overflow –

+0

对不起,这没有帮助。 – Loic

+1

选中此项:http://blogs.adobe.com/cssdk/category/cssdk/indesign-extensions,特别是hostObjectDelegate – Loic

相关问题