Adobe Illustrator导出JSON脚本:prompt()不显示致报错求助
Adobe Illustrator脚本中prompt()无法弹出的解决方法
问题原因
Illustrator的JSX脚本环境中,prompt()这类原生弹窗函数经常会因为以下原因无法正常工作:
- 脚本以非交互模式运行(比如批处理、动作触发),AI会自动禁用交互弹窗,直接返回
null - AI首选项中勾选了“禁用脚本交互功能”
- 系统权限或窗口焦点问题,导致弹窗被拦截
解决方案
1. 确保脚本在交互模式下运行
- 手动运行脚本:通过
文件>脚本>其他脚本选择你的JSX文件,运行时保证Illustrator窗口处于前台并获得焦点 - 检查首选项:打开
编辑>首选项>脚本与增效工具(不同AI版本路径可能略有不同),取消勾选“禁用脚本中的交互功能”选项
2. 替换prompt为ScriptUI对话框(推荐)
prompt()在AI脚本中兼容性较差,改用ScriptUI创建自定义对话框,不仅更稳定,还能添加输入验证。以下是修改后的核心逻辑:
// 替换原exportPrefixedObjects中的prompt部分,用ScriptUI对话框获取输入 function exportPrefixedObjects(doc) { // 创建ScriptUI对话框 var win = new Window("dialog", "输入前缀与参考点", [100, 100, 400, 200]); win.orientation = "column"; // 前缀输入框 var prefixGroup = win.add("group"); prefixGroup.add("statictext", undefined, "前缀(逗号分隔):"); var prefixInput = prefixGroup.add("edittext", undefined, "btn_,dlg_"); prefixInput.preferredSize.width = 200; // 参考点输入框 var refGroup = win.add("group"); refGroup.add("statictext", undefined, "参考点(逗号分隔):"); var referencePointInput = refGroup.add("edittext", undefined, "center,top_left"); referencePointInput.preferredSize.width = 200; // 按钮组 var btnGroup = win.add("group"); btnGroup.alignment = "right"; var okBtn = btnGroup.add("button", undefined, "确定"); var cancelBtn = btnGroup.add("button", undefined, "取消"); // 按钮事件 var userInput = {}; okBtn.onClick = function() { userInput.prefixes = prefixInput.text; userInput.refPoints = referencePointInput.text; win.close(); }; cancelBtn.onClick = function() { win.close(); }; // 显示对话框,等待用户输入 win.show(); // 用户取消则返回空数组 if (!userInput.prefixes) return []; var prefixes = {} var prefixArr = userInput.prefixes.split(',') var referenceArr = userInput.refPoints.split(',') for(var i=0; i<prefixArr.length; i++){ prefixes[prefixArr[i]] = referenceArr[i] } // 后续逻辑保持不变... }
3. 调试阶段临时硬编码参数
如果只是想快速验证脚本其他逻辑是否正常,可以暂时跳过交互,直接赋值:
// 替换原prompt行 var prefixInput = "btn_,dlg_"; var referencePointInput = "center,top_left";
完整修改后脚本
// Helper function to export prefixed objects function exportPrefixedObjects(doc) { // 创建ScriptUI对话框 var win = new Window("dialog", "输入前缀与参考点", [100, 100, 400, 200]); win.orientation = "column"; // 前缀输入框 var prefixGroup = win.add("group"); prefixGroup.add("statictext", undefined, "前缀(逗号分隔):"); var prefixInput = prefixGroup.add("edittext", undefined, "btn_,dlg_"); prefixInput.preferredSize.width = 200; // 参考点输入框 var refGroup = win.add("group"); refGroup.add("statictext", undefined, "参考点(逗号分隔):"); var referencePointInput = refGroup.add("edittext", undefined, "center,top_left"); referencePointInput.preferredSize.width = 200; // 按钮组 var btnGroup = win.add("group"); btnGroup.alignment = "right"; var okBtn = btnGroup.add("button", undefined, "确定"); var cancelBtn = btnGroup.add("button", undefined, "取消"); // 按钮事件 var userInput = {}; okBtn.onClick = function() { userInput.prefixes = prefixInput.text; userInput.refPoints = referencePointInput.text; win.close(); }; cancelBtn.onClick = function() { win.close(); }; // 显示对话框,等待用户输入 win.show(); // 用户取消则返回空数组 if (!userInput.prefixes) return []; var prefixes = {} var prefixArr = userInput.prefixes.split(',') var referenceArr = userInput.refPoints.split(',') for(var i=0; i<prefixArr.length; i++){ prefixes[prefixArr[i]] = referenceArr[i] } const prefixedObjects = []; for (var i = 0; i < doc.layers.length; i++) { const layer = doc.layers[i]; const name = layer.name; // Check if the layer name starts with a prefix for (var prefix in prefixes) { if (name.startsWith(prefix)) { // Get the reference point const referencePoint = prefixes[prefix]; // Get the position of the layer const pos = layer.position; // Get the width and height of the layer const width = layer.width; const height = layer.height; // Create an object with the layer's info const obj = { name: name, x: pos[0], y: pos[1], referencePoint: referencePoint, width: width, height: height }; prefixedObjects.push(obj); break; } } } return prefixedObjects; } // Helper function to get artboard info function getArtboardInfo(artboard) { return { name: artboard.name, origin: { x: artboard.rulerOrigin[0], y: artboard.rulerOrigin[1] } }; } // Get the active document and the selected artboard const doc = app.activeDocument; const selectedArtboard = doc.artboards[doc.artboards.getActiveArtboardIndex()]; // Get the array of prefixed objects and their info const prefixedObjects = exportPrefixedObjects(doc); // Get the artboard info const artboardInfo = getArtboardInfo(selectedArtboard); // Append the artboard info to each prefixed object prefixedObjects.forEach(obj => { obj.artboardName = artboardInfo.name; obj.artboardOrigin = artboardInfo.origin; }); // Convert the array of objects to a JSON string const jsonString = JSON.stringify(prefixedObjects); // Save the JSON file const file = new File(doc.path + '/prefixed-objects.json'); file.open('w'); file.write(jsonString); file.close();
内容的提问来源于stack exchange,提问作者Ziad Hossam
相关产品推荐
相关产品推荐

