Extendscript对话框关闭按钮故障:点击触发删除而非关闭
问题根源分析
- 语法错误导致意外删除:
saveSettings函数中,处理Identity[2] < c的代码块未被包含在Identity[0] == 'R'的条件分支内,导致任何操作(包括关闭窗口时的隐性触发)都会执行该删除逻辑,这是触发意外删除的核心原因。 - 关闭按钮未绑定正确事件:自定义Close按钮未设置
onClick回调,点击后无法直接关闭窗口;同时window.cancelElement绑定了Close按钮,但未定义其行为,导致右上角关闭按钮触发未知逻辑。 - 递归UI调用的窗口管理问题:每次添加/删除后调用
UI()重新创建窗口,但旧窗口的关闭逻辑未完全处理,可能导致窗口事件混乱。
修复代码
以下是修正后的完整脚本:
UI(); function UI() { var window = new Window('dialog', 'Settings', undefined, {closeButton: true}); window.orientation = 'column'; var iFolderC = loadSettings(['I','F',0]); var iFolders = []; // 替换eval,用数组存储文件夹路径,避免变量名混乱 for (var i = 1; i <= iFolderC; i++) { iFolders.push(loadSettings(['I','F',i])); } var inputGroup = window.add('group'); inputGroup.add('panel', undefined, 'Input Folders', {borderStyle:'raised'}); inputGroup.orientation = 'column'; var removeButtons = []; for (i = 0; i < iFolderC; i++) { var inputFolder = inputGroup.add('group'); inputFolder.add('panel', [0, 0, 300, 20], iFolders[i], {borderStyle:'raised'}); var removeBtn = inputFolder.add('button', undefined, 'Remove'); removeButtons.push(removeBtn); // 用闭包绑定正确的索引,避免循环变量陷阱 (function(index) { removeBtn.onClick = function() { window.close(); saveSettings(['R', 'F', index + 1], ''); // 索引+1对应原逻辑中的i值 }; })(i); } var newFolder = inputGroup.add('group'); var newIFolder = newFolder.add('edittext',[0, 0, 300, 20]); var addButton = newFolder.add('button', undefined, 'Add'); addButton.onClick = function () { if (newIFolder.text.trim() !== '') { // 空输入不处理 window.close(); saveSettings(['N', 'F', 0], newIFolder.text); } }; var closeButton = window.add('button', undefined, 'Close'); // 绑定Close按钮的关闭事件 closeButton.onClick = function() { window.close(); }; window.cancelElement = closeButton; // 右上角关闭和ESC触发Close按钮逻辑 window.center(); window.show(); } function saveSettings(Identity, Fixture) { var file = '~/Documents/Read and write text102323210.txt'; var str = read(file); var arr = str.split('\n'); var c = Math.floor(arr[0]); if (Identity[0] == 'N') { if (Identity[1] == 'F') { arr[c + 1] = Fixture; arr[0] = c + 1; str = arr.join('\n'); // 用join替代toString+replace,更高效 write(file, str); UI(); } } else if (Identity[0] == 'R') { // 用else if避免多余判断 if (Identity[1] == 'F') { var removeIndex = Identity[2]; if (removeIndex <= c && removeIndex >= 1) { // 校验索引有效性 // 统一处理删除逻辑,不管是最后一个还是中间的 arr.splice(removeIndex, 1); // 直接删除对应位置元素 arr[0] = c - 1; str = arr.join('\n'); write(file, str); UI(); } } } } function loadSettings(Identity) { var file = '~/Documents/Read and write text102323210.txt'; var str = read(file); var arr = str.split('\n'); if (Identity[0] == 'I' && Identity[1] == 'F') { if (Identity[2] == 0) { return Math.floor(arr[0]) || 0; // 处理空文件情况 } else { return arr[Identity[2]] || ''; } } return ''; } function read(filePath) { var file = new File(filePath); if (!file.exists) { // 处理文件不存在的情况,初始化内容 file.open('w'); file.write('0'); file.close(); return '0'; } file.open('r'); file.encoding = 'UTF8'; var text = file.read(); file.close(); return text; } function write(filePath, textContent) { var file = new File(filePath); file.open('w'); file.encoding = 'UTF8'; file.write(textContent); file.close(); }
关键修复点说明
- 修复语法错误:将原
saveSettings中游离的删除逻辑移入R分支内,避免非删除操作触发删除。 - 替换eval使用数组存储:用数组
iFolders和removeButtons替代eval创建的变量,避免变量名冲突和闭包陷阱,代码更易维护。 - 正确绑定Close按钮事件:给自定义Close按钮添加
window.close()的回调,同时window.cancelElement确保右上角关闭和ESC键触发相同的关闭逻辑,不会触发删除。 - 优化删除逻辑:用
splice方法简化数组删除操作,替代原循环移位的复杂逻辑,减少错误。 - 增加边界校验:添加空输入判断、文件不存在初始化、索引有效性校验,提升脚本稳定性。
内容的提问来源于stack exchange,提问作者Killovicz
相关产品推荐
相关产品推荐

