卡住了尝试从Javascript函数中的文本输入中引用值

时间:2018-08-11 11:20:00

标签: javascript jsx

我正在尝试为Photoshop创建一个插件。我的文件结构如下(如Adobe关于构建插件的指南所建议):

我的根文件夹包含两个文件夹:客户端和主机。 客户端文件夹包含index.html和index.js。 Index.html提供了设计并引用了两个javascript文档。 Index.js包含对index.html中元素的引用,并发送指令以触发下面提到的index.jsx文件夹中包含的函数。

主机文件夹包含index.jsx,其中包含实际上触发photoshop工具的所有功能。为了获得此javascript代码,我在Mac上使用xtools将我创建的photoshop操作转换为.jsx文件。

我希望我的插件具有一个文本框,用户可以在其中输入一个值(必须为数字),然后单击一个按钮以触发一个函数,其中一部分需要包含该函数的值。他们输入的号码。

在此示例中,该功能将图像调整为用户所需的像素数。

(注意:-当数字在函数中为静态/预设且脚本无需任何其他输入即可简单触发该函数时,脚本可完美工作-我只是在努力将文本框中的值输入函数中)

这是每个文档上的代码:

index.html:

<input type="text" id="resizeinput" placeholder="enter value in pixels">
<button id="resizebutton">Go!</button>

Index.js:

var customresize = document.querySelector("#resizebutton");

customresize.onclick = function() {
  csInterface.evalScript("ResizeCustom()");
};

Index.jsx:

cTID = function(s) { return app.charIDToTypeID(s); };
sTID = function(s) { return app.stringIDToTypeID(s); };

//
//==================== Resize Custom ==============
//
function ResizeCustom() {
  // Image Size
  function step1(enabled, withDialog) {
    if (enabled != undefined && !enabled)
      return;
    var dialogMode = (withDialog ? DialogModes.ALL : DialogModes.NO);
    var desc1 = new ActionDescriptor();
    desc1.putUnitDouble(cTID('Wdth'), cTID('#Pxl'), 1234);
    desc1.putBoolean(sTID("scaleStyles"), true);
    desc1.putBoolean(cTID('CnsP'), true);
    desc1.putEnumerated(cTID('Intr'), cTID('Intp'), sTID("bicubicSmoother"));
    executeAction(sTID('imageSize'), desc1, dialogMode);
  };

  step1();      // Image Size
};

我需要引用在文本框“ #resizeinput”中输入的值,在index.jsx中的javascript表示“ 1234”的地方。

到目前为止,我最好的选择是将1234替换为: document.getElementById(“#resizeinput”)。value)

但这没用。

1 个答案:

答案 0 :(得分:0)

在您的Index.js中:

var customresize = document.querySelector("#resizebutton"),
    resizeInput = document.querySelector("#resizeinput");

customresize.onclick = function()
{
    csInterface.evalScript("ResizeCustom(" + resizeInput.value + ")");

};

在Index.jsx中:

cTID = function(s) { return app.charIDToTypeID(s); };
sTID = function(s) { return app.stringIDToTypeID(s); };

function ResizeCustom(_arg) {
    var desc1 = new ActionDescriptor();
    desc1.putUnitDouble(cTID('Wdth'), cTID('#Pxl'), _arg);
    desc1.putBoolean(sTID("scaleStyles"), true);
    desc1.putBoolean(cTID('CnsP'), true);
    desc1.putEnumerated(cTID('Intr'), cTID('Intp'), sTID("bicubicSmoother"));
    executeAction(sTID('imageSize'), desc1, DialogModes.NO);
};

请注意,这不会做任何检查(如果您尝试传递字符串,则会出现错误)。

p.s。在Abdobe的世界中,插件是用C ++编写的,而HTML面板是扩展。以防万一:)

p.p.s我建议使用HTML Panels Tips检查Davide Barranca的博客,例如关于将数据从JS传递到JSX的问题:https://www.davidebarranca.com/2014/01/html-panels-tips-4-passing-objects-from-html-to-jsx/