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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:15:55