Полноэкранный режим запроса Javascript ненадежен - PullRequest
34 голосов
/ 26 февраля 2012

Я пытаюсь использовать JavaScript FullScreen API, используя обходные пути для текущих нестандартных реализаций отсюда:

https://developer.mozilla.org/en/DOM/Using_full-screen_mode#AutoCompatibilityTable

К сожалению, он ведет себя очень хаотично. Я забочусь только о Chrome (использую v17), но, поскольку у меня возникли проблемы, я провел несколько тестов в Firefox 10 для сравнения, результаты похожи.

Приведенный ниже код пытается установить браузер в полноэкранный режим, иногда он работает, иногда нет. Он ВСЕГДА вызывает предупреждение, чтобы указать, что запрашивает полноэкранный режим. Вот что я нашел:

  • Это ОБЫЧНО устанавливает полноэкранный режим. Он может перейти в состояние, когда это перестает работать, но предупреждение все еще происходит, т.е. он все еще запрашивает FullScreen, но он не работает.
  • Может работать, если вызывается из обработчика нажатия клавиш (document.onkeypress), но не при вызове при загрузке страницы (window.onload).

Мой код выглядит следующим образом:

function DoFullScreen() {

    var isInFullScreen = (document.fullScreenElement && document.fullScreenElement !==     null) ||    // alternative standard method  
            (document.mozFullScreen || document.webkitIsFullScreen);

    var docElm = document.documentElement;
    if (!isInFullScreen) {

        if (docElm.requestFullscreen) {
            docElm.requestFullscreen();
        }
        else if (docElm.mozRequestFullScreen) {
            docElm.mozRequestFullScreen();
            alert("Mozilla entering fullscreen!");
        }
        else if (docElm.webkitRequestFullScreen) {
            docElm.webkitRequestFullScreen();
            alert("Webkit entering fullscreen!");
        }
    }
}

Ответы [ 4 ]

74 голосов
/ 17 марта 2012

requestFullscreen() не может быть вызван автоматически из-за соображений безопасности (по крайней мере, в Chrome). Поэтому он может быть вызван только действием пользователя, таким как:

  • клик (кнопка, ссылка ...)
  • клавиша (нажатие клавиши, нажатие клавиши ...)

А если ваш документ содержится во фрейме:

  • allowfullscreen должен присутствовать в элементе <iframe> *

* W3 Spec:
«... Чтобы запретить встроенному контенту работать в полноэкранном режиме, только встроенный контент, специально разрешенный с помощью атрибута allowfullscreen элемента HTML iframe, сможет переходить в полноэкранный режим. Это предотвращает переход ненадежного контента в полноэкранный режим ...»

Подробнее: W3 Спецификация на весь экран

Также упоминается @ abergmeier , в Firefox ваш полноэкранный запрос должен быть выполнен в течение 1 секунды после того, как сгенерированное пользователем событие было запущено.

20 голосов
/ 22 ноября 2014

Я знаю, что это довольно старый вопрос, но он все еще является лучшим результатом в Google при поиске сообщения об ошибке FireFox при вызове mozRequestFullScreen() из кода, который не был вызван каким-либо взаимодействием с пользователем.

Запрос на полный экран был отклонен, потому что Element.mozRequestFullScreen () не был вызван из короткого запуск созданного пользователем обработчика событий.

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

Но я пишу приложение для цифровых вывесок на основе HTML5, которое работает в контролируемой среде без какого-либо вмешательства пользователя. Для моего приложения жизненно важно иметь возможность автоматического переключения в полноэкранный режим.

К счастью, FireFox предлагает возможность удалить это ограничение в браузере, которое довольно сложно найти. Я напишу это здесь как справочник для всех, кто найдет эту страницу через поиск в Google, как я сделал

На странице about:config найдите следующий ключ и установите для него false

full-screen-api.allow-trusted-requests-only

Для моего приложения для цифровых вывесок я также удалил подсказку, которую браузер показывает при вводе fullscren:

full-screen-api.approval-required

Надеюсь, это может сэкономить кому-то часы, которые я потратил на поиск этих настроек.

6 голосов
/ 09 апреля 2012

У вас нет ничего плохого в вашей функции.В Firefox, если вы вызываете эту функцию напрямую, она не будет работать в полноэкранном режиме.Как вы знаете, в запросе на полный экран было отказано, потому что docElm.mozRequestFullScreen ();не был вызван изнутри кратковременного пользовательского обработчика событий.Итак, вы должны вызывать функцию по событию, например, onClick в Firefox.

<a href="#" onClick="DoFullScreen()">Full Screen Mode</a>
3 голосов
/ 10 января 2017

Другая неожиданная проблема с requestFullscreen() заключается в том, что родительские кадры должны иметь атрибут allowfullscreen, в противном случае Firefox выдает следующую ошибку:

Запрос на полноэкранный режим был отклонен, поскольку хотя бы один из элементов, содержащихся в документе, не является iframe или не имеет атрибута allowfullscreen.

Помимо iframes, это может быть вызвано тем, что ваша страница находится в рамке frameset. Поскольку frameset устарело, атрибут HTML5 allowfullscreen не поддерживается и вызов requestFullscreen() завершается неудачно.

Документация Firefox прямо заявляет об этом в MDN, но я думаю, что здесь стоит повторить это для разработчиков, которые могут не прочитать документацию в первую очередь .... Гм

Только элементы в документе верхнего уровня или в атрибуте allowfullscreen могут отображаться в полноэкранном режиме. Это означает, что элементы внутри frame или object не могут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...