Adobe InDesign 2023 JS脚本添加afterOpen监听器时弹出模态警告求助
解决InDesign脚本添加事件监听时弹出警告的问题
问题原因
你遇到的弹窗问题,本质是添加afterOpen事件监听时,InDesign内部存在未处理的隐性模态对话框,导致脚本执行时触发冲突警告。原代码中!ev.isValid && app.eventListeners.add(...)的判断逻辑不够严谨,且未考虑当前环境的交互状态。
修复方案
- 临时禁用用户交互:添加事件监听前关闭InDesign的用户交互,避免触发隐性弹窗;操作完成后恢复原设置。
- 严谨判断事件监听是否存在:明确检查事件监听是否已存在,避免重复添加的同时规避无效对象判断带来的冲突。
- 修复循环变量作用域:给循环变量
i添加声明,避免全局变量污染。
修改后的完整代码
main(); function main() { // 临时禁用用户交互,屏蔽弹窗 const originalInteractionLevel = app.scriptPreferences.userInteractionLevel; app.scriptPreferences.userInteractionLevel = UserInteractionLevels.NEVER_INTERACT; let ev = app.eventListeners.itemByName("onAfterOpen"); // 确认事件监听不存在时再添加 if (!ev.isValid) { ev = app.eventListeners.add("afterOpen", myfunc); ev.name = "onAfterOpen"; } // 恢复原用户交互级别 app.scriptPreferences.userInteractionLevel = originalInteractionLevel; } function myfunc(myEvent) { const doc = myEvent.parent; // 通过事件对象获取当前文档,比activeDocument更可靠 const allCharacterStyles = doc.allCharacterStyles; const allParagraphStyles = doc.allParagraphStyles; // 关闭字符样式的连字 for (let i = 1; i < allCharacterStyles.length; i++) { allCharacterStyles[i].ligatures = false; } // 关闭段落样式的连字和断字 for (let i = 1; i < allParagraphStyles.length; i++) { allParagraphStyles[i].ligatures = false; allParagraphStyles[i].hyphenation = false; } }
关键修改说明
- 交互控制:通过
UserInteractionLevels.NEVER_INTERACT临时屏蔽所有系统弹窗,操作完成后恢复,既解决警告问题,又不影响后续正常操作。 - 事件监听逻辑:将原短路逻辑拆分为明确的
if判断,避免隐式错误。 - 文档获取:改用
myEvent.parent获取当前打开的文档,避免多文档场景下的识别错误。 - 变量作用域:给循环变量
i添加let声明,限定局部作用域,避免全局变量冲突。
内容的提问来源于stack exchange,提问作者Xyster Dust
相关产品推荐
相关产品推荐

