Изменение видимости не сразу скрывает iFrame - PullRequest
1 голос
/ 13 июня 2009

У меня есть страница, которая при определенном действии делает iframe видимым и заполняет iframe некоторым HTML-кодом (например, блоком множественного выбора и кнопкой ok).

Для кнопки OK в iframe метод onClick определен примерно так:

onClick="parent.hideIFrame();parent.processMultiSelectBox();"

Когда пользователь нажимает кнопку ОК в iframe (предположительно, после воспроизведения с полем множественного выбора), я бы хотел, чтобы iFrame немедленно исчезал, а затем выбранные значения в окне множественного выбора могут быть обработаны. Но это не то, что происходит. IFrame остается видимым в течение времени, когда другая функция выполняется, и исчезает только после завершения второй функции.

Функция hideIFrame довольно проста:

function hideIFrame() {
  frmObj = document.all.iFrameID;
  if(frmObj) {
    frmObj.style.visibility = "hidden";
  }
}

Я перефразировал вышеприведенную функцию для ясности (убрал некоторые назначения переменных индикатора и т. Д.)

Вторая функция фактически выполняет циклы для всех опций в объекте множественного выбора и работает с ним. Это занимает около полсекунды и только после этого мой iFrame исчезает. Немного неприятно видеть, как оно задерживается на полсекунды, когда я нажимаю кнопку ОК.

Мой вопрос: есть ли способ, которым я могу заставить проклятую вещь исчезнуть быстрее. Говоря на языке «классического С», есть ли «флеш», чтобы изменение видимости произошло немедленно?

Я заметил, что если я добавлю «alert» в качестве первой строки в моей второй функции, iframe немедленно исчезнет, ​​но теперь это окно ОК в окне предупреждений, которое задерживается на время, необходимое для завершения второй функции.

Спасибо.

РЕДАКТИРОВАТЬ: Исходя из ответа DDaviesBrackett, это то, что я в итоге сделал:

Клик в iframe изменился на:

onClick="parent.hideAndProcessMultiSelectBox(parm1, parm2);"

Функция hideAndProcessMultiSelectBox была определена как:

function hideAndProcessMultiSelectBox( parm1, parm2 ) {
   hideIFrame();
   setTimeout( function() { processMultiSelectBox( parm1, parm2 ); }, 0 );
}

Вуаля .. без промедления ..

1 Ответ

3 голосов
/ 13 июня 2009

Вы уже дошли до корня своей проблемы; Перекомпоновка документа не происходит до тех пор, пока не завершится текущий поток JS (чтобы не перерисовывать много раз во время выполнения JS). Вы должны вернуть управление браузеру, прежде чем выполнять дорогостоящую обработку.

Самый простой способ добиться этого, хотя он и не делает очевидного кода в малейшей степени, это вызвать processMultiSelectBox в setTimeout с задержкой 0:

onClick="parent.hideIFrame();parent.setTimeout(parent.processMultiSelectBox,0);"

Если вам нужно передать параметры тому, для чего вы устанавливаете тайм-аут, у вас есть два варианта: установить тайм-аут для строки, которая переходит в Javascript (плохой, плохой, очень плохой, ужасный) или определить анонимную функцию который вызывает тот, который вас интересует:

onClick="parent.hideIFrame();parent.setTimeout(function(){parent.processMultiSelectBox(foo, bar, 'baz');},0);"

Ответ RSolberg также может помочь, хотя есть разница между visibility:hidden и display:none.

...