Переменные Javascript повреждены в обработчике событий изменения ориентации iPad

#javascript #ipad #dom-events #landscape-portrait #orientation-changes

#javascript #iPad #dom-события #альбомная-портретная #ориентация-изменения

Вопрос:

Я разрабатываю pageslider каталога Html и Javascript для iPad, который показывает одну страницу в портретном и две страницы в альбомной ориентации.

Две переменные для поддержания состояния каталога обрабатываются при каждом изменении ориентации в обработчике событий.

Переменные повреждены, когда я быстро переворачиваю iPad. Они в порядке, когда я использую его так, как обычно (то есть довольно медленно).

Я попытался использовать locked переменную, чтобы предотвратить запуск обработчика, если он еще не завершен, т. Е. В случае, если mobile Safari прерывает выполнение Javascript при изменении ориентации:

 function updateOrientation() {
    if (locked) return;
    locked = true;
    ...
 

Однако, похоже, это никогда не так; обработчик всегда завершается до того, как он будет вызван снова.

Следовательно, как переменные повреждаются?

Есть идеи?

Ответ №1:

Я нашел ответ.

Обычно я ожидаю, что событие изменения ориентации будет подразумевать изменение ориентации, т. Е. window.orientation Должно измениться значение (книжная -> альбомная или альбомная -> портретная).

Однако быстрые броски и повороты приводят к тому, что обработчик события вызывается два раза подряд с одним и тем же значением, из которого считывается window.orientation . Это неожиданно и искажает переменные состояния.

Я решил проблему, сохранив последнюю известную ориентацию и немедленно вернувшись, если значение не изменилось с прошлого раза.

 function updateOrientation() {
if (lastOrientation == isPortrait()) return; // prevent erroneous orientation changes
lastOrientation = isPortrait();