【问题标题】:Debug JavaScript injection in ActionScript (Flash Builder)在 ActionScript (Flash Builder) 中调试 JavaScript 注入
【发布时间】: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)不可访问。

非常感谢任何帮助!

【问题讨论】:

    标签: javascript actionscript-3 actionscript flash-builder


    【解决方案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()”,但您需要处于调试模式。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2011-12-01
    • 2011-04-12
    • 2011-06-12
    相关资源
    最近更新 更多