- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Adobe CEP (它允许开发人员为 Adobe CC 产品创建窗口扩展)。我的大部分代码是现代 JavaScript(该平台使用 Chromium 57、Node.js 7.7.4)。 但是,为了访问 DOM,我需要在 Adobe 中编写一些函数 ExtendScript并从普通的 JS 执行它们。唯一的方法是使用他们提供的 csInterface.evalScript(script, callback)
执行脚本。 script
必须是一个字符串,在我的例子中是一个转换为字符串的函数调用。 我希望能够通过 evalScript
将对象传入和传出 ExtendScript,但 evalScript
只接受并返回一个字符串。
目前,我将每个对象属性作为其自己的参数传递。这很笨重,但很管用。
虽然我的第一个是 JSON.stringify()
,但不幸的是 ExtendScript 是 ECMAScript 3 的一种方言,这意味着不支持JSON.parse()
.
我不能只将对象参数连接到脚本函数调用中,因为这样字符串的计算结果为 foo([object Object])
。
我见过像 eval()
/uneval()
或 Object.toSource()
这样的函数,但那些不是由 Chromium 支持。
这是一个示例,类似于我当前的方法:
functions.js (ES3/ExtendScript)
function drawCircle(x, y, name) {
// pick a layer
var layer = app.activeDocument.layers[0];
var diameter = 10;
var top = y + diameter / 2;
var left = x - diameter / 2;
// draw ellipse in layer
var circle = layer.pathItems.ellipse(top, left, diameter, diameter);
circle.name = name;
circle.filled = true;
return true;
}
app.js (ES6)
const csInterface = new CSInterface(); // provided by Adobe
async function circle() {
const dataObject = {x: 10, y: 10, name: 'Hello world!'};
// the script to call
// evaluates to drawCircle(10,10,'Hello world!');
const script = "drawCircle(" + dataObject.x + "," + dataObject.y + ",'" + dataObject.name + "');";
return new Promise((resolve, reject) => {
csInterface.evalScript(script, (result) => {
resolve(result);
});
});
}
正如预期的那样,circle()
调用了 drawCircle()
,我正在处理的文档中出现了一个椭圆。但是,通过连接执行脚本/调用函数感觉很错误。所以总而言之,
dataObject
转换为字符串并通过 evalScript()
将其传递给 drawCircle()
, drawCircle()
返回 dataObject
并将其作为对象接收回来。目前,返回一个对象只会导致 [object Object]"
作为返回值。最佳答案
将对象从 Javascript 传递到 ExtendScript 的唯一方法是使用 JSON.stringify()
将其作为 JSON 字符串发送。
是的,关于不支持 JSON.parse()
的说法是正确的,但是,您不需要。
您仍然可以发送字符串化对象,并将作为 对象 到达 ExtendScript。
const dataObject = {x: 10, y: 10, name: 'Hello world!'};
const script = "drawCircle(" + JSON.stringify(dataObject) + ")";
然后在 ExtendScript 中,您可以通过执行以下操作来解决问题:
function drawCircle(obj) {
var layer = app.activeDocument.layers[0];
var radius = 10;
var top = obj.y + 5;
var left = obj.x - 5;
var circle = layer.pathItems.ellipse(top, left, radius, radius);
circle.name = obj.name;
circle.filled = true;
return true;
}
您将需要这个 ExtendScript 模块,将其复制到与您的 jsx 相同的文件夹中
Link to Indiscripts ExtendScript JSON module
然后将其包含在 #include 'json.jsx';
(或 //@include 'json.jsx'
以避免 linter 错误)在你的顶部jsx。这将添加一个 JSON 全局函数,该函数提供两种方法:JSON.eval()
和 JSON.lave()
。
我们需要的方法是 lave()
,它允许您将对象字符串化回 Javascript。将其视为更友好的 JSON.stringify()
版本。
function drawCircle(obj) {
var layer = app.activeDocument.layers[0];
var radius = 10;
var top = obj.y + 5;
var left = obj.x - 5;
// draw ellipse in layer
var circle = layer.pathItems.ellipse(top, left, radius, radius);
circle.name = obj.name;
circle.filled = true;
return JSON.lave(circle);
}
然后在 javascript 中你可以再次解析为一个对象:
const dataObject = {x: 10, y: 10, name: 'Hello world!'};
const script = "drawCircle(" + JSON.stringify(dataObject) + ")";
csInterface.evalScript(script, (result) => {
console.log(JSON.parse(result));
});
我在最新的 CEP 运行时版本 (v9) 中对此进行了测试。
关于javascript - 如何将对象从 Javascript (Adobe CEP) 传递给 Adobe ExtendScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55555324/
我是 Adobe InDesign Server 的新手,我很难找到一个好的厨房水槽应用程序。我从 SDK 获得的所有示例似乎都部分起作用。我想要做的就是从服务器端使用 InDesign 的母版页
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
我有一个带有完整设计页面的 xd adobe 链接。我想在 adobe xd windows 桌面应用程序中打开这些设计页面,但我不能。如何在 adobe xd windows 桌面应用程序中打开此链
activeDocument.fitArtboardToSelectedArt() 调用此命令时,AI 在 AI 5.1/6 32 位和 64 位版本上崩溃。我可以使用菜单中的命令。有没有人遇到过这个
activeDocument.fitArtboardToSelectedArt() 调用此命令时,AI 在 AI 5.1/6 32 位和 64 位版本上崩溃。我可以使用菜单中的命令。有没有人遇到过这个
如果可以,应该在哪里配置? 从文档中,所有提到的忽略文件都是关于从 SVN 提交 中排除 .vlt,但我们面临相反的问题 — 我们想排除来自 VLT 提交 的文件系统上的文件——例如.DS_Store
我正在 AdobeXD 中制作移动下拉菜单。 除了我的主页,我还有另外两个画板;菜单本身和一个按钮。 我想要做的就是触发菜单向下滑动,并将退出按钮覆盖在首先触发效果的按钮顶部。 它会覆盖退出按钮,
Javascript 的 setTimeout函数是window的一个方法目的。此对象在 ExtendScript 中不存在,因此不可用于为 Adobe InDesign 或 Illustrato
有人可能会争论它是否与摄影有关,但由于它与 DNG 格式有关,所以在这里问。 我正在尝试构建一个 Adobe DNG SDK,以便我能够将许多不同的相机原始格式转换为 *.dng 格式。 我为 h
我正在 Adobe CQ5.5 中开发一个自定义容器组件,我想要一个自定义消息作为占位符,而不是默认的“将组件或 Assets 拖到此处”。 到目前为止,我发现我必须添加 cq:emptyText
我想在导入 XML 时使用 Internet URL 将图像加载到 InDesign 模板中。 这可能吗?或者图片是否需要存储在本地机器上? 最佳答案 这可能吗?不需要。镜像需要存储在本地机器上吗?是
在 Adobe Edge Animate 中,如何获取 Symbol 的当前时间? 我混合使用 jQuery 和 Adobe Edge 代码来编程我的页面。我想检查一个符号的时间是否停留在第一
如果我将 adobe xd 文档放置在本地计算机上的任何位置。 示例:C:\doc\adobe-xd\brand\brand.xd 打开它并运行插件 是否可以检索 adobe xd 文档位置。 P.S
我正在使用 AEM 6.1 和 Maven 来管理依赖项。我可以看到 bundle com.adobe.granite.poi 版本 2.0.0 随 AEM 实例一起提供。但我似乎无法在 Adob
我正在使用 adobe labs magic selection 工具,但它要求用户进行 adobe 登录。有什么办法可以不让用户登录,但仍然使用 magic selection 工具?我听说过这个,
我们有 Adobe PDF writer,希望能够使用它而不是 ghostscript。 SaveAs() 函数是否锁定在 ghostscript 中,如果是,我该如何使用 adobe pdf w
我想知道 Adobe Experience Manager (AEM) 6.2/6.3 使用哪个版本的 Apache Sling?我在各种网站上进行了搜索,包括 Adobe 自己的文档,但似乎
还在努力探索动作剧本。有没有办法访问Android手机的接近感应器?想要使用传感器的输出关闭探测器。找到了里查多松/接近感应器(https://github.com/richardolsson/pro
我对 Day Cq5 还很陌生。我的对话框中有一个复选框,我想在用户选择或取消选择它时在我的 jsp 中检索它的 bool 值。请帮忙 最佳答案 如果要从组件的 JSP 中检索值,请执行以下操作: b
http://helpx.adobe.com/experience-manager/kb/HowToDefineComponentListDynamically.html 我在上面尝试过,但由于文章的
我是一名优秀的程序员,十分优秀!