【发布时间】:2016-06-17 23:36:24
【问题描述】:
这是一个具有挑战性的问题。我对脚本比较陌生,但有一个我想开始工作的想法。
我有一个基于数组动态生成下拉列表的脚本:该数组中的每个项目都会创建一个dropdownlist。
function getDropDownLists(inputArray, grp) { //input an array and the UI Group we're adding these DDLs to
try {
eval(grp + "Array = [];"); //Creates an array to store the DDLs we're about to create
var listName; //Create variable to store name of DDL we're creating as we iterate through inputArray
for (var i = 0; i < inputArray.length; i++) {
listName = grp + "SrcLevel_" + i.toString(); //Get the name for the DDL we're about to create
eval('var ' + listName + ' = ' + grp + '.add("dropdownlist",[0,0,150,25])'); //add a DDL for the current array item
eval(listName + '.add("item","' + listName + '")'); //This line creates an item in each dropdown to tell me its name
eval(grp + "Array[" + i + "] = " + listName + ";"); //Adds newly created DDL to the storage array
}
} catch (e) {
alert("Error on line " + e.line + ":\n" + e.message);
}
}
当我调用这个函数时(它在这里可能无法正常工作,因为我为了显示目的已经对其进行了一些清理),它正确地创建了我所有的dropdownlists。但是,我想为每个事件创建onChange 事件,以引用创建的存储阵列中的前一个事件并更改其内容。如果dropdownlists 是已知的,我知道如何使onChange 事件起作用,但是我将从事的每个项目都是不同的,我希望在每次项目需求发生变化时都不必重新调整工具来实现它.
例如,当我调用getDropDownLists(['mom','dad','baby'],family) 时,我会得到三个dropdownlists:familySrcLevel_0,familySrcLevel_1,familySrcLevel_2。然后我将如何为这些dropdownlists 中的每一个创建onClick 事件,知道我并不总是知道有多少?这样的事情可能吗?必须在 Extendscript 中完成。
【问题讨论】:
-
我应该补充一点,我需要
familySrcLevel_1来引用列表中的familySrcLevel_0的选择。 -
听起来很复杂。你能把你的问题分解成更小的部分吗?此外,您的代码示例没有显示您尝试使用
onChange函数的任何内容。最后,我建议摆脱try catch块以及eval使您的代码更难调试 -
为什么要去掉
try catch块?它的目的不是为了调试吗?我必须留下eval语句;它们让我可以使用唯一的变量名称即时创建dropdownlists,以便我可以更早地引用它们。 -
如果你这么认为的话。我总是发现使用 try catch 有点脏。您可以使用一些资源字符串(Adobe JS 工具指南第 79 页link)来生成您的 UI,而无需使用 eval。但我认为你不能用它们创建函数。
-
如果我知道 UI 总是会是什么,我就不需要使用
eval。但是因为根据不同的项目,输入数组可能会发生变化,我并不总是知道我需要多少dropdownlists。所以我基于该数组动态创建 UI,这样我就不需要在每次更改时都重写脚本。它还允许我通过为它们提供唯一生成的名称来引用这些dropdownlists,因此子dropdownlists可以根据父dropdownlists更改其内容。