在 ActionScript (Flash Builder) 中调试 JavaScript 注入

Posted

技术标签:

【中文标题】在 ActionScript (Flash Builder) 中调试 JavaScript 注入【英文标题】:Debug JavaScript injection in ActionScript (Flash Builder) 【发布时间】:2015-07-24 09:53:23 【问题描述】:

我正在开发 Adob​​e Flash Builder 4.6 中的 InDesign CS6 扩展。出于某种原因,我的代码(长时间运行良好)现在抛出错误null is not an object。错误位于 javascript 注入中(最后一行):

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 的参数是否为 null,但一切正常。这是正在调用的函数(在 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);

在这个地方我被困住了。我不知道错误出现在 javascript 的哪一行。

我对 ActionScript 很陌生,似乎找不到有关如何在 ActionScript 中调试 Javascript 注入的文档。另外我真的不知道,哪些变量(如 app)可在 javascript 代码中访问,哪些变量(如控制台 - 我无法编写 console.log)不可访问。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

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

【讨论】:

我已经检查了 null。 HtmlLoader 不工作,我在 Actionscript 中重写了 JavaScript 代码。【参考方案2】:

首先检查 this.jsxInterface 是否是返回的有效对象。您可以将调试用作模式并在那里设置断点。然后查看this.jsxInterface[name]。

几年来我没有进行任何扩展,但是没有“this”应该可以访问 jsxInterface。正如您在上面将其设置为变量一样。

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

但简而言之,您的错误表明您正在尝试使用一个不存在的对象(this.jsxInterface 在我的拙见中)。也许你的js代码很好,也许参数也很好,但问题应该位于中间。

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

【讨论】:

感谢您的回答,不幸的是它没有帮助。我将 javascript 代码交换为 actionscript 并遇到了一个新问题:***.com/questions/30322899/… 对不起,没有帮助。 检查这个:blogs.adobe.com/cssdk/category/cssdk/indesign-extensions 特别是 hostObjectDelegate

以上是关于在 ActionScript (Flash Builder) 中调试 JavaScript 注入的主要内容,如果未能解决你的问题,请参考以下文章

子数涵数·Flash——初识ActionScript

ActionScript 3 在Flash中清理文本

flash 中的 actionscript3 自定义事件

Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系

有啥理由在 Flash 中编辑 ActionScript 3 文件实际上不会编辑它?

在 actionscript flash 中创建登录