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

#javascript #google-chrome #firefox #webgl #dom-events

#javascript #google-chrome #firefox #webgl #dom-события

Вопрос:

Происходит ли какое-либо событие JavaScript, когда пользователь включает полноэкранный режим в Chrome или FireFox?

У меня есть приложение WebGL с шириной и высотой холста, установленными на определенный размер, и я хотел бы изменить его размер, среди прочего, когда пользователь включает полноэкранный режим. Если такого события нет, должен ли я начать изучать способы заполнения окна браузера canvas, хотя это усложняет процесс отладки?

Ответ №1:

Вы можете сравнить ширину экрана с шириной или высотой браузера.

 if (screen.width == window.innerWidth amp;amp; screen.height == window.innerHeight) {
    //full web browser
}
  

РЕДАКТИРОВАТЬ: Будьте осторожны в Chrome, если у пользователя есть менеджер загрузок, панель перевода или элемент inspercter открыты, высота отличается от экрана.

Комментарии:

1. Это сработало бы, но потребовало бы постоянной проверки изменений в некоторой интервальной функции, что было бы менее предпочтительно по сравнению с обработкой событий.

2. Я создал этот скрипт для просмотра размеров мобильного устройства. onresize событие проверки, проверьте onload сначала. frommelt.fr/dimension.html

3. Но будьте осторожны в Chrome, если у пользователя есть менеджер загрузок, панель перевода или элемент inspercter открыты, высота отличается от экрана.

Ответ №2:

Вы можете использовать document.mozFullScreen и document.webkitIsFullScreen как показано ниже:

 if ((!document.mozFullScreen amp;amp; !document.webkitIsFullScreen)) {
   //FullScreen is disabled
} else {
   //FullScreen is enabled
}
  

Комментарии:

1. Я получаю false для этого, когда я на самом деле нахожусь в полноэкранном режиме. Chrome в OS X.

2. @tremby вы включили полноэкранный режим с помощью браузера или вы использовали javascript requestFullscreen api? Потому что этот флаг предназначен только для определения того, перешел ли элемент в полноэкранный режим, а не само окно

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

Ответ №3:

Я провел тест в разных браузерах (IE9, Chrome, FireFox, Opera amp; Safari), эта функция работает.

 function chkfullscreen() {
    if (window.navigator.standalone || (document.fullScreenElement amp;amp; document.fullScreenElement != =null) || (document.mozFullScreen || document.webkitIsFullScreen) || (!window.screenTop amp;amp; !window.screenY))
        // full screen
        alert('full screen');
}
  

Комментарии:

1. if (!window.screenTop amp;amp; !window.screenY) в некоторых случаях не работает (например, если окно браузера не имеет границ и пользователь развернул окно максимально). Помимо тестирования в нескольких браузерах, вам необходимо протестировать на нескольких операционных системах и оконных менеджерах.

2. спасибо, что указали на ситуацию. я бы посоветовал попробовать этот полноэкранный тестовый сайт pearce.org.nz/fullscreen

Ответ №4:

Я создаю новое событие, которое срабатывает, когда браузер переходит на полноэкранный режим и обратно (через F11 или HTML5 Fullscreen API).

 (function(){
    var ok = true;
    window.addEventListener('resize', function()
    {
        setTimeout(function () 
        {
            if (ok)
            {
                ok = false;
                setTimeout(function () { ok = true; }, 170);
                sendEvent(window.outerWidth === screen.width amp;amp; window.outerHeight === screen.height);
            }
        }, 30);
    }, false);

    function sendEvent(fullscreen)
    {
        var event = new CustomEvent('fullscreenchange', { detail: fullscreen, bubbles: true, cancelable: true });

        if (document.fullscreenElement)
            document.fullscreenElement.dispatchEvent(event);
        else
           document.dispatchEvent(event);  
    }
})();
  

Использование с JavaScript

 document.addEventListener('fullscreenchange', fullscreenChanged, false);

function fullscreenChanged(event)
{
    console.log('Fullscreen: '   event.detail);
}
  

или jQuery

 $(document).on('fullscreenchange', function()
{
    console.log('Fullscreen: '   event.detail);
});
  

Ответ №5:

В 2019 году, через восемь лет после того, как был задан вопрос, MDN рекомендует использовать fscreen, поскольку браузеры по-прежнему не поддерживают fullscreen API согласованным образом.

Чтобы определить, перешел ли браузер на полноэкранный режим, прослушайте событие fullscreenshange :

 fscreen.addEventListener('fullscreenchange', handler, options);
  

Чтобы получить элемент, который в данный момент находится в полноэкранном режиме, используйте fscreen.fullscreenElement .

Демонстрация fscreen показывает, что полноэкранное состояние может быть обнаружено.

Ответ №6:

После долгих поисков и разочарований это лучший метод, который я нашел:

 function isFullScreen() {
    // do stuff for full screen
}

function notFullScreen() {
    // do stuff for non-full screen
}
document.addEventListener("fullscreenchange", function () {
    (document.fullscreen) ? isFullScreen() : notFullScreen();
}, false);

document.addEventListener("mozfullscreenchange", function () {
    (document.mozFullScreen) ? isFullScreen() : notFullScreen();
}, false);

document.addEventListener("webkitfullscreenchange", function () {
    (document.webkitIsFullScreen) ? isFullScreen() : notFullScreen();
}, false);
  

Или если вы предпочитаете не использовать тернарный оператор:

 function isFullScreen() {
    // do stuff for full screen
}

function notFullScreen() {
    // do stuff for non-full screen
}
document.addEventListener("fullscreenchange", function () {
    if (document.fullscreen) {
        isFullScreen();
    } else {
        notFullScreen();
    }
}, false);

document.addEventListener("mozfullscreenchange", function () {
    if (document.mozFullScreen) {
        isFullScreen();
    } else {
        notFullScreen();
    }
}, false);

document.addEventListener("webkitfullscreenchange", function () {
    if (document.webkitIsFullScreen) {
        isFullScreen();
    } else {
        notFullScreen();
    }
}, false);
  

Комментарии:

1. Работает ли это, если пользователь переходит в полноэкранный режим, а затем загружает страницу впоследствии? Или они перезагружают текущую страницу?

2. @skibulk не уверен, в моем случае перезагрузка страницы автоматически выводит меня из полноэкранного режима, но я применял это к видеоплееру.