You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Extendscript对话框关闭按钮故障:点击触发删除而非关闭

问题根源分析

  1. 语法错误导致意外删除:saveSettings函数中,处理Identity[2] < c的代码块未被包含在Identity[0] == 'R'的条件分支内,导致任何操作(包括关闭窗口时的隐性触发)都会执行该删除逻辑,这是触发意外删除的核心原因。
  2. 关闭按钮未绑定正确事件:自定义Close按钮未设置onClick回调,点击后无法直接关闭窗口;同时window.cancelElement绑定了Close按钮,但未定义其行为,导致右上角关闭按钮触发未知逻辑。
  3. 递归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();
}

关键修复点说明

  1. 修复语法错误:将原saveSettings中游离的删除逻辑移入R分支内,避免非删除操作触发删除。
  2. 替换eval使用数组存储:用数组iFolders和removeButtons替代eval创建的变量,避免变量名冲突和闭包陷阱,代码更易维护。
  3. 正确绑定Close按钮事件:给自定义Close按钮添加window.close()的回调,同时window.cancelElement确保右上角关闭和ESC键触发相同的关闭逻辑,不会触发删除。
  4. 优化删除逻辑:用splice方法简化数组删除操作,替代原循环移位的复杂逻辑,减少错误。
  5. 增加边界校验:添加空输入判断、文件不存在初始化、索引有效性校验,提升脚本稳定性。

内容的提问来源于stack exchange,提问作者Killovicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:44:56