AE面板:将obj从JS发送到JSX

时间:2017-05-24 23:46:42

标签: javascript jquery extendscript after-effects

我正在为After Effects编写一个面板,我正在尝试将一个Object从我的main.js发送到我的jsx文件。从我可以找到的样本中,他们说我不能发送一个对象,但必须使用stringify()对象并传递它。

我已经尝试发送一个对象和一个字符串化对象的字符串 - 这两个对我都不起作用。

main.js

var profileUI = {
     script: '',
     data: {
          csv:    $('#csv')[0].checked,
          feed:   $('#json')[0].checked,
          gs:     $('#googleSheets')[0].checked
     },
}
var csInterface = new CSInterface();
csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '"")' );

myFunctions.jsx

$._ext_SB={
    batch : function(profileUI) {

        var str = "";
        for (prop in profileUI) {
          str += prop + " [" + typeof profileUI[prop] + "]: " + profileUI[prop] + ".\n";
        }
        alert(str);
    },
};

我收到错误:无法在第1行运行脚本。预计:)

它似乎没有得到一个实际的字符串,就像我上面提到的那样,尝试传递一个对象也不起作用(这将是更好的选择)。

3 个答案:

答案 0 :(得分:1)

在js端,也可以使用模板字符串: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/template_strings

evalScript(`$._ext_SB.batch('${encodeURIComponent(JSON.stringify(profileUI))}')`);

单引号包含字符串,将其作为字符串参数传递给 jsx 函数。

并且 encodeURIComponent 会转义字符串可能包含的所有内容,将其发送到 jsx 时可能会导致问题。

然后,在 jsx 中反转编码和字符串化:

var profileUI = JSON.parse(decodeURIComponent(_profileUI));

replace(/"/g,'\\"') 仅替换由 JSON.parse 生成的双引号。

可能导致问题的字符串还可能包含除双引号之外的其他特殊字符。

答案 1 :(得分:0)

这里有三个问题。参见:

JavaScript中的语法错误

您对"的通话中有一个额外的双引号(evalScript)字符。这样:

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '"")' );

应该是这个(请注意删除两个最终"个字符之一):

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '")' );

JSON需要被包围

正如您指出in another answer,您需要转义JSON字符串中的"个字符,以便在evalScript()处理时正确地取消转义。这导致:

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI).replace(/"/g,'\\"') + '")' );

为清楚起见,使用.replace(/"/g,'\\"')完成转义。

evalScript不会自动解析JSON

您需要在JSON.parse()参数上调用profileUI以获取对象版本。参见:

$._ext_SB={
    batch : function(_profileUI) {
        // Convert the input string back into an object.
        var profileUI = JSON.parse(_profileUI);

        // Everything else should work okay...
        var str = "";
        // ...
    }
}

一些注意事项:

  1. JSON.parse()返回的对象将是一个简单的对象 - 它将包含与您调用的对象JSON.stringify()相同的属性,但它不具有任何关联的功能。
  2. ExtendScript不会自动提供JSON支持。如果在启动面板时它存在于应用程序中,那是因为所有面板(包括Adobe构建的面板)共享一个ExtendScript上下文。一些Adobe面板已经包含一个JSON库,您通常可以使用它。但是,如果您无法使用JSON,则需要自己包含兼容的JSON库。有人提到here

答案 2 :(得分:0)

这行代码......

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI) + '")' );

需要改为:

csInterface.evalScript('$._ext_SB.batch("' + JSON.stringify(profileUI).replace(/"/g,'\\"') + '")' );

JSON.stringify创建一个有效的字符串但是当我尝试通过'"'+someString+'"'创建字符串的源代码时,这只有在someString本身不包含任何引号时才有效。 replace()用\“替换所有引号,以便它可以作为有效字符串发送。