0

我正在为 Photoshop 开发一个插件脚本,但遇到了一个非常奇怪的问题,最接近这个问题的人在这里:为什么尝试多次调用它们或将它们分配给 Javascript 中的类变量会消失局部变量?

所以阅读他的解决方案后,我梳理了我的语法,我找不到任何我没有纠正的问题,然后再试一次。我将包含完整的代码,但这里是问题的要点,我通过声明它在全局空间中声明这个对象,它是函数之外的成员:

prefs = new Object();
prefs.db_file = "";
prefs.bk_file = "";

prefs.text = new Object();
prefs.text.top = 0.6;
prefs.text.bottom = 0.9;
prefs.text.padding = 0.05;
prefs.text.size = 12;
prefs.text.shadow = true; 

基本大纲(伪代码):

declare global variables
main() {

Dialogue()

do stuff with the variables
}

Dialogue() {
    declare new window
    accept user interaction
    store in global variable
}

我已经运行了几次,在extendscript调试器中一步一步地观察变量,每次变量存在并且值是正确的,直到它们退出Dialogue()函数,那么唯一存在的变量是prefs.text。阴影和 prefs.text.size

我尝试过的一切,包括删除“.text”。部分已返回相同。我找不到我的语法是否错误,如果它是错误的,那么为什么不是所有的首选项。变量消失?而且我相当确定所有变量都以相同的方式处理。

2013 年 10 月 22 日更新:为了帮助排除语法问题,我找到了 JSlint 并通过它运行了我的代码,并检查并纠正了它提出的问题。剩下的唯一问题是对“var”选择进行分组。它改变了我的对象声明方法,一些代码排序,不必要的';'标准化我的缩进。结果:一样。删除相同的变量并返回相同的输出。

这是完整的代码:

#target photoshop
app.bringToFront();

prefs = new Object();
prefs.db_file = "";
prefs.bk_file = "";

prefs.text = new Object();
prefs.text.top = 0.6;
prefs.text.bottom = 0.9;
prefs.text.padding = 0.05;
prefs.text.size = 12;
prefs.text.shadow = true;



function main() {

Dialogue();

var db_file2 = new File(prefs.db_file);

db_file2.open('r');
var data = Array();
var str = "";
var data_str = "";
while(!db_file2.eof) {
    str = db_file2.readln(); 
    data.push(str.split(","));
    data_str += str;
};

db_file2.close();
alert(data_str);



};

function Dialogue() {

var dlg = new Window ("dialog","Create New Slide Set");
    dlg.orientation = "row";
    dlg.alignChildren = "fill";
    dlg.pref_group = dlg.add("group");
        dlg.pref_group.orientation = "column";
        dlg.pref_group.alignChildren = "fill";

        dlg.pref_group.db_val =    dlg.pref_group.add("edittext",undefined,prefs.db_file);
        dlg.pref_group.db_find =  dlg.pref_group.add("button",undefined,"select data file");
        dlg.pref_group.db_find.onClick = function() { 
            selectedFile = File.openDialog("Please select CSV  file.","CSV File:*.csv"); 
            if(selectedFile != null) {
                dlg.pref_group.db_val.text =  decodeURI(selectedFile.fsName); 
                prefs.db_file = dlg.pref_group.db_val.text;
                };
        };
        dlg.pref_group.db_val.onChange = function() {
            prefs.db_file = dlg.pref_group.db_val.value;
            alert("db_file has been changed!");
        };

        dlg.pref_group.bk_val = dlg.pref_group.add("edittext",undefined,prefs.bk_file);
        dlg.pref_group.bk_find = dlg.pref_group.add("button",undefined,"select background image");
        dlg.pref_group.bk_find.onClick = function() { 
            selectedFile = File.openDialog("Please select PNG file.","Image File:*.png"); 
            if(selectedFile != null) { 
                dlg.pref_group.bk_val.text =  decodeURI(selectedFile.fsName); 
                prefs.bk_file = dlg.pref_group.bk_val.text;
                };
        };
        dlg.pref_group.bk_val.onChange = function() {
            prefs.bk_file = dlg.pref_group.bk_val.value;
        };


        dlg.pref_group.tt_grp = dlg.pref_group.add("group");
        dlg.pref_group.tt_grp.orientation = "row";
        dlg.pref_group.tt_grp.alignChildren = "fill";
        dlg.pref_group.tt_grp.tt = dlg.pref_group.tt_grp.add("statictext",undefined,"Text Top");

        dlg.pref_group.tt_grp.tt_dsp = dlg.pref_group.tt_grp.add("edittext",undefined,prefs.text.top);
        dlg.pref_group.tt_grp.tt_dsp.preferredsize = [100,200];

        dlg.pref_group.tt_grp.tt_dsp.onChange = function() {

            prefs.text.top = dlg.pref_group.tt_grp.tt_dsp.value;
         };

        dlg.pref_group.bt_grp = dlg.pref_group.add("group");
        dlg.pref_group.bt_grp.orientation = "row";
        dlg.pref_group.bt_grp.alignChildren = "fill";
        dlg.pref_group.bt_grp.bt = dlg.pref_group.bt_grp.add("statictext",undefined,"Text bottom");
        dlg.pref_group.bt_grp.bt_dsp = dlg.pref_group.bt_grp.add("edittext",undefined,prefs.text.bottom);
        dlg.pref_group.bt_grp.bt_dsp.preferredsize = [100,200];

        dlg.pref_group.bt_grp.bt_dsp.onChange = function() {

            prefs.text.bottom = dlg.pref_group.bt_grp.bt_dsp.value;
         }; 

        dlg.pref_group.pd_grp = dlg.pref_group.add("group");
        dlg.pref_group.pd_grp.orientation = "row";
        dlg.pref_group.pd_grp.alignChildren = "fill";
        dlg.pref_group.pd_grp.pd = dlg.pref_group.pd_grp.add("statictext",undefined,"Padding");
        dlg.pref_group.pd_grp.pd_dsp = dlg.pref_group.pd_grp.add("edittext",undefined,prefs.text.padding);
        dlg.pref_group.pd_grp.pd_dsp.preferredsize = [100,200];

        dlg.pref_group.pd_grp.pd_dsp.onChange = function() {

            prefs.text.padding = dlg.pref_group.pd_grp.pd_dsp.value;
         };

        dlg.pref_group.sd_grp = dlg.pref_group.add("group");
        dlg.pref_group.sd_grp.orientation = "row";
        dlg.pref_group.sd_grp.alignChildren = "fill";
        dlg.pref_group.sd_grp.sd = dlg.pref_group.sd_grp.add("statictext",undefined,"Shadow");
        dlg.pref_group.sd_grp.sd_dsp = dlg.pref_group.sd_grp.add("checkbox",undefined,"");
        dlg.pref_group.sd_grp.sd_dsp.value = prefs.text.shadow;

        dlg.pref_group.sd_grp.sd_dsp.onChange = function() {

            prefs.text.shadow = dlg.pref_group.sd_grp.sd_dsp.value;
         }; 

        dlg.ok_group = dlg.add('group');
        dlg.ok_group.orientation = "column";
        dlg.ok_group.ok_btn = dlg.ok_group.add("button",undefined,"ok"); 
        dlg.ok_group.ok_btn.onClick = function() {


            prefs.text.shadow = dlg.pref_group.sd_grp.sd_dsp.value;
            prefs.text.padding = dlg.pref_group.pd_grp.pd_dsp.value;
            prefs.text.bottom = dlg.pref_group.bt_grp.bt_dsp.value;
            prefs.text.top = dlg.pref_group.tt_grp.tt_dsp.value;
            prefs.bk_file = dlg.pref_group.bk_val.value;
            prefs.db_file = dlg.pref_group.db_val.value;
            dlg.close(0);

        };

dlg.center();
dlg.show();
    };

main();
4

1 回答 1

1

就这么简单……

'edittext' 框没有 .value 属性,它们具有 .text 属性,试图访问 .value 返回 null 并破坏了变量。

我的研究带我进入了很多领域,语法约定、JSlint、对象定义,讽刺地研究了一个不同的问题(没有调用 onChange 函数)让我意识到唯一没有被忽视的变量是阴影复选框, 和字体大小参数,但此时字体大小参数根本没有被编辑,阴影是唯一由复选框定义的东西。经验教训:当某些东西部分工作时,比较工作部分的相似之处

于 2013-10-22T20:14:13.273 回答