在 ActionScript (Flash Builder) 中调试 JavaScript 注入
Posted
技术标签:
【中文标题】在 ActionScript (Flash Builder) 中调试 JavaScript 注入【英文标题】:Debug JavaScript injection in ActionScript (Flash Builder) 【发布时间】:2015-07-24 09:53:23 【问题描述】:我正在开发 Adobe 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 注入的主要内容,如果未能解决你的问题,请参考以下文章
Actionscript,AS3,MXML,Flex,Flex Builder,Flash Builder,Flash,AIR,Flash Player之关系