Подтвердить что ты не робот

Javascript запрос fullscreen ненадежен

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

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

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

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

  • Он USUALLY устанавливает полноэкранный режим. Он может перейти в состояние, в котором это перестает работать, но предупреждение все еще происходит, то есть оно все еще запрашивает 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!");
        }
    }
}
4b9b3361

Ответ 1

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

  • нажмите (кнопка, ссылка...)
  • key (keydown, keypress...)

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

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

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

Подробнее: Спецификация W3 в полноэкранном режиме

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

Ответ 2

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

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

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

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

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

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

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

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

full-screen-api.approval-required

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

Ответ 3

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

<a href="#" onClick="DoFullScreen()">Full Screen Mode</a>

Ответ 4

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

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

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

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

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