2

我有一个脚本(我没有编写),其中包含一个app.addEventListener('afterOpen', addVariables);事件(addVariables 是函数的名称)。

我把app.addEventListener('afterSave', addVariables);它改成我想要的那样工作,除了它正在创建一个“永无止境”的循环。

基本上发生的事情是脚本提取用户名(即:Tia)并将其作为可变文本添加到 InDesign CC 中的粘贴板上。使用“afterOpen”命令,只要我打开文档,名称就会更新;这违背了脚本的目的,因为我想知道谁最后保存了文档,而不是最后打开文档的人(永远是我)。该脚本与“afterSave”命令一起正常工作,因为它显示了最后保存它的人的姓名;但是,我现在创建了一个新问题,即每当有人尝试保存文档时,脚本都会不断循环*。

所以,我的问题是:我可以告诉 eventListener 每个文档只运行一次吗?


我不熟悉 javascript——我对 applescript 有相当的了解。

谢谢你的帮助!


iMac 运行 osx 10.8.4 • Adob​​e InDesign CC • 使用 Adob​​e ExtendScipt Toolkit 进行编辑



*它会循环,因为一旦有人保存文档,脚本就会运行并更改文本变量,InDesign(正确地)将其记录为对文档的更改。所以现在文档被标记为“未保存”(文档名称旁边有一个星号)。如果我按 command+s 再次将其保存以“清除”星号,则 eventListener 会选择 afterSave 命令并再次更新文档,而 InDesign 会选择更改并将其标记为未保存...所以您可以看看我所说的循环是什么意思。您可以告诉文档关闭(command+w)并告诉它在关闭之前保存,它会这样做,然后关闭。但是,我宁愿只保存文档一次,变量文本更新,然后如果在该文档仍处于打开状态时对该文档进行任何进一步更改,脚本将不会再次运行。显然,我希望脚本在每个新文档上运行一次。

4

3 回答 3

1

您可以通过跟踪脚本是否更新了特定文档的用户名来解决此问题。如果我们已经更新了它,那么在我们再次更新之前停止。否则,请继续更新。

您的 JavaScript 将如下所示:

#targetengine "session"

(function(){
  // Keep track of the files where we've updated
  // the user's name onto the pasteboard.
  var isUserNameUpdated = {};

  app.addEventListener('afterSave', function(theEvent) {
    var filename = theEvent.fullName;
    if (isUserNameUpdated[filename] === true) {
      return;
    }
    isUserNameUpdated[filename] = true;

    // Put the rest of your code here
  });

  app.addEventListener('afterOpen', function(theEvent) {
    // afterOpen fires twice: once when the document opens
    // and once when the window loads. Only the first event
    // has the fullName property. So don't run the second time,
    // to avoid causing an error.
    //
    // See: http://forums.adobe.com/message/5410190
    if (theEvent.target.constructor.name !== 'Document') {
      return;
    }

    // If we've previously saved the file, closed it,
    // then opened it again, then forget that we had 
    // saved it previously.
    var filename = theEvent.properties.fullName;
    isUserNameUpdated[filename] = false;
  });
})();
于 2014-04-24T13:45:46.257 回答
1

问题确实是每个保存操作都会触发侦听器,从而导致需要无休止地保存未保存的文档。一种解决方案是禁用侦听器,以便您可以在不触发事件的情况下强制保存并在之后启用它。

function addVariables(openEvent){
	
    var doc = openEvent.parent;
    
    while ( doc.constructor.name != "Document" )
    {
	    if ( doc.constructor.name == "Application" ){ return; }
	   
	   doc = doc.parent;
	}
	//Adding User name to text variables
	createTextVariable(doc, "User name", (Folder.myDocuments).parent.displayName );
	
  //Removing the afterSave listener
	removeAfterSaveEventListener();
  
  //Saving document without firing event listener
	doc.save();
  
  //Adding the afterSave listener
	addAfterSaveEventListener();
}
var removeAfterSaveEventListener = function() {
  var el = app.eventListeners.item ( "onAfterSave" );
	el.isValid && el.remove();
}

var addAfterSaveEventListener = function() {
  app.addEventListener('afterSave', addVariables).name = "onAfterSave";
}

//Adding the afterSave listener
addAfterSaveEventListener();

于 2017-05-05T09:11:59.897 回答
0

至少在 Applescript 中,可以选择让事件侦听器对 beforeSave做出反应:

tell application "Adobe InDesign CC 2017"
        make event listener with properties {event type:"beforeSave", handler:myHandler}
    end tell

这应该够了吧。

于 2017-05-05T07:05:57.357 回答