[ID CS4-CS6] Проблема с Event

Tiburtsy

Топикстартер
12 лет на форуме
Сообщения
48
Реакции
14
JavaScript:
#targetengine "session"

app.activeDocument.addEventListener (Event.AFTER_SELECTION_ATTRIBUTE_CHANGED, changeDoc);

function changeDoc(){
    app.activeDocument.selection[0].parentStory.justification=Justification.RIGHT_ALIGN
//    app.activeDocument.selection[0].textFramePreferences.verticalJustification=VerticalJustification.CENTER_ALIGN
    $.writeln($.hiresTimer)
}

Что-то на такой мелочи застрял на двое суток :(
Когда делаю Justification.RIGHT_ALIGN, то событие начинает вызываться бесконечно. Не могу понять в чём проблема.
Когда делаю вертикальное выравнивание фрейма (VerticalJustification.CENTER_ALIGN), то код отлично срабатывает один раз и всё.
Код максимально упрощён для примера.
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 532
Реакции
10 035
Ну дык Капитан Жабоскрипт ответственно заявляет, что вы пытаетесь изменять документ в обработчике события его изменения
Рекурсия божественна '))'
 

Tiburtsy

Топикстартер
12 лет на форуме
Сообщения
48
Реакции
14
Не в рекурсии дело - закоментированная строка прекрасно отрабатывает как надо. Ответ про рекурсию очевидный и поверхностный.
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 532
Реакции
10 035
закоментированная строка прекрасно отрабатывает как надо
Правильно заданный топиковый вопрос - "почему закомментированная строка не вызывает рекурсии"?
Ответ - чудны и неисповедимы пути программистов в чалмах
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 532
Реакции
10 035
Ответ же на вопрос - "как мне сделать чтобы рекурсия не вызывалась?" - завести флажок, который проверяется в обработчике и не дает выравниванию запуститься из выравнивания.
Если бы вы немножко покурили азы матчасти по ключевому слову "реентерабельность" то вы б не застревали бы изза любой очевидной мелочи
 

Tiburtsy

Топикстартер
12 лет на форуме
Сообщения
48
Реакции
14
Ну я же не совсем дурак. Закомментируем проблемную строку, раскомментируем вторую строку, создаём новый документ с фреймом, запускаем скрипт, сдвигаем фрейм и видим, что он отцентрировался по вертикали и событие завершилось!
Если быть точнее, событие вызывалось 3 раза: на селект, на мув и на выравнивание. А так как больше никаких изменений не произошло, то и событие заглохло.
Не первый год программирую и не задаю очевидных вопросов про "рабочие" закомментированные строки
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 532
Реакции
10 035
Давайте все таки определимся, вопрос был
почему закомментированная строка не вызывает рекурсии
т.е. чисто риторический, адресованный к адобовским индусам и т д
или
как мне сделать чтобы рекурсия не вызывалась?
Ответ на второй вопрос я вам дал, если хотите все таки поговорить на тему первого вопроса, у меня есть несколько собственных теоретических соображений на этот счет и при наличии свободного времени (которых есть у меня) мы можем это тут обсудить.

Но я так понимаю, вы все ж сперва желаете двухдневную эпопею завершить или как?
 

Oleg Butrin

15 лет на форуме
Сообщения
1 887
Реакции
1 127
JavaScript:
// @targetengine "session"

app.activeDocument.addEventListener(
  Event.AFTER_SELECTION_ATTRIBUTE_CHANGED,
  changeDoc
);

function changeDoc() {
  if (
    app.activeDocument.selection.length &&
    app.activeDocument.selection[0].hasOwnProperty("geometricBounds") &&
    app.activeDocument.selection[0].hasOwnProperty("parentStory")
  ) {
    var tf = app.activeDocument.selection[0];
    var story = tf.parentStory;
    if (
      tf.textFramePreferences.verticalJustification !=
      VerticalJustification.CENTER_ALIGN
    ) {
      tf.textFramePreferences.verticalJustification =
        VerticalJustification.CENTER_ALIGN;
    }
    if (story.justification != Justification.RIGHT_ALIGN) {
      story.justification = Justification.RIGHT_ALIGN;
    }
  }
  $.writeln($.hiresTimer);
}
 
  • Спасибо
Реакции: Tiburtsy

Tiburtsy

Топикстартер
12 лет на форуме
Сообщения
48
Реакции
14
JavaScript:
    if (story.justification != Justification.RIGHT_ALIGN) {
      story.justification = Justification.RIGHT_ALIGN;
}
Вот он, спасительный костыль, который заставил мой код корректно работать и завершать событие!
Олегу спасибо, тему можно считать закрытой.
 

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 532
Реакции
10 035
Ответ же на вопрос - "как мне сделать чтобы рекурсия не вызывалась?" - завести флажок, который проверяется в обработчике и не дает выравниванию запуститься из выравнивания.
Если бы вы немножко покурили азы матчасти по ключевому слову "реентерабельность" то вы б не застревали бы изза любой очевидной мелочи
Я думаю, если б вы внииательно прочли это сообщение, то и сами додумались бы до него ;)