2012-05-22 4 views
39

Я создаю 3D многопользовательскую игру с Three.js, где игроки могут присоединиться к различным существующим играм. После нажатия «play», рендеринг добавляется к странице и полноэкранным. Это отлично работает, но проблема в том, что, когда я выхожу из полноэкранного режима, он все еще остается добавленным. Я хотел бы удалить его, но я не знаю, когда!Как определить, когда страница выходит из полноэкранного режима?

Итак, в основном, я ищу событие, в котором говорится, что «этот элемент вышел из полноэкранного режима».

Это, как я добавить визуализатор к странице:

container = document.getElementById('container'); 
document.body.appendChild(container); 

var renderer = new THREE.WebGLRenderer({antialias: true}); 
renderer.setSize(WIDTH, HEIGHT); 
container.appendChild(renderer.domElement); 

это, если, как я весь экран его:

THREEx.FullScreen.request(container); 
renderer.setSize(screen.width, screen.height); 

Кроме того, есть ли способ, чтобы остановить это раздражает заголовок появляться всякий раз, когда кто-то указывает свою мышь на верхнюю часть страницы? И, я думаю, я могу просто предотвратить побег от того, что он делает (выходя из полноэкранного режима) в Firefox и Chrome с preventDefault?

А также кто-нибудь знает, почему Firefox настолько медленнее, чем Chrome в 3D-рендеринге? Я имею в виду, я использую WebGL, это означает, что GPU используется!

EDIT:

"fullscreenchange" событие действительно уволят, но он имеет разные имена под разными браузерами. Например, в Chrome это называется «webkitfullscreenchange», а в Firefox это «mozfullscreenchange».

+4

Вы можете добавить слушателя для изменения размера страницы после полноэкранного просмотра. –

+0

Возможный дубликат [Как определить, включен ли пользователь во весь экран в браузере] (http://stackoverflow.com/questions/5617963/how-to-detect-if-user-has-enabled-full-screen-in- браузер) –

ответ

34

Спецификация Fullscreen указывает, что событие (с соответствующим префиксом) запускается в документе в любое время, когда изменяется полноэкранное состояние страницы, включая включение в полноэкранный режим и выход из него. Внутри этого события вы можете проверить document.fullScreenElement, чтобы увидеть, является ли страница полноэкранным или нет. Если это полноэкранный режим, свойство будет не нулевым.

Check out MDN для получения более подробной информации.

Что касается других вопросов: Нет, предотвратить выход из полноэкранного режима Esc. Это компромисс, который был сделан для обеспечения того, чтобы пользователь всегда контролировал работу своего браузера. Браузер будет никогда не позволяет пользователям выйти из полноэкранного режима. Период.

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

+0

Спасибо! Хотя, я сомневаюсь, что это имеет какое-то отношение к моему коду, это довольно просто ... – corazza

+3

Эй @ Тоджи, я только что попробовал это: 'document.addEventListener (" fullscreenchange ", function() {console.log (" f ");}, false);', но это не работает! – corazza

+0

ОК, разрешил, обновил вопрос. – corazza

11

я использую John Dyer's code, интегрированный с Тони, и комментарии Yannbane, чтобы создать центральный обработчик, и добавив несколько слушателей назвать:

var changeHandler = function(){           
     //NB the following line requrires the libary from John Dyer       
     var fs = window.fullScreenApi.isFullScreen(); 
     console.log("f" + (fs ? 'yes' : 'no'));        
     if (fs) {                
     alert("In fullscreen, I should do something here");     
     }                  
     else {                 
     alert("NOT In fullscreen, I should do something here");    
     }                  
    }                   
    document.addEventListener("fullscreenchange", changeHandler, false);  
    document.addEventListener("webkitfullscreenchange", changeHandler, false); 
    document.addEventListener("mozfullscreenchange", changeHandler, false); 

Это проверяется только в 12 млн унций.

Пожалуйста, не стесняйтесь расширить

+0

@vsync - просто замените операторы 'alert' своим кодом – ErichBSchulz

+0

Это не сработало для меня. Протестировано в firefox на ubuntu. –

+0

Не для меня. Chrome 58, Win10. – miny1997

53

Вот как я это сделал:

if (document.addEventListener) 
{ 
    document.addEventListener('webkitfullscreenchange', exitHandler, false); 
    document.addEventListener('mozfullscreenchange', exitHandler, false); 
    document.addEventListener('fullscreenchange', exitHandler, false); 
    document.addEventListener('MSFullscreenChange', exitHandler, false); 
} 

function exitHandler() 
{ 
    if (document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement !== null) 
    { 
     /* Run code on exit */ 
    } 
} 

Поддержка Opera, Safari, Chrome с webkit, Firefox/Gecko с moz, IE 11 с MSFullScreenChange, и будет поддерживать фактическая спецификация с fullscreenchange, как только она была успешно реализована во всех браузерах. Очевидно, что Fullscreen API поддерживается только в современных браузерах, поэтому я не предоставлял резервные копии attachEvent для более старых версий IE.

+3

будет гореть, если я полноэкранный, но он должен срабатывать, если я закрываю или выхожу из полноэкранного экрана. –

+3

У Firefox есть результат не полноэкранного document.fullscreenElement как 'undefined', в результате чего'! == null' всегда является истинным. – pragmar

+1

Я изменил выражение 'if' на этот' if (! Document.webkitIsFullScreen &&! Document.mozFullScreen &&! Document.msFullscreenElement) 'для обнаружения выхода из полноэкранного режима –

9

API для браузеров изменен. Например: в Chrome отсутствует document.webkitIsFullScreen. Это то, что работает для меня:

document.addEventListener("fullscreenchange", onFullScreenChange, false); 
document.addEventListener("webkitfullscreenchange", onFullScreenChange, false); 
document.addEventListener("mozfullscreenchange", onFullScreenChange, false); 

onFullScreenChange() { 
    var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement; 

    // if in fullscreen mode fullscreenElement won't be null 
} 
+0

Этот ответ сработал отлично – Nick

4

Я немного изменил код Alex W, чтобы сделать события огня по полноэкранным выходам только. Испытано в Firefox 53.0, Chrome 48.0 и 53.0 Chromium:

if (document.addEventListener) 
{ 
    document.addEventListener('webkitfullscreenchange', exitHandler, false); 
    document.addEventListener('mozfullscreenchange', exitHandler, false); 
    document.addEventListener('fullscreenchange', exitHandler, false); 
    document.addEventListener('MSFullscreenChange', exitHandler, false); 
} 

function exitHandler() 
{ 
    if (document.webkitIsFullScreen === false) 
    { 
     ///fire your event 
    } 
    else if (document.mozFullScreen === false) 
    { 
     ///fire your event 
    } 
    else if (document.msFullscreenElement === false) 
    { 
     ///fire your event 
    } 
} 
+0

тот же код, только менее практичный –

+0

Не должен ли быть тест для 'document.fullscreenElement'? –

+0

Это точный правильный ответ на этот вопрос. «Обнаружение полноэкранного выхода» –

0

Mozilla, MDN page намекнул мне об использовании fscreen в качестве поставщика агностик подход к полноэкранных API. К сожалению, даже в этот самый день (2018-02-06) эти API не полностью стандартизированы; По умолчанию Firefox не имеет встроенных API-интерфейсов.

Во всяком случае, здесь URL в fscreen: https://github.com/rafrex/fscreen (. Он доступен как npm пакет для использования в Node.js на основе сборки трубопроводов)

На данный момент, это кажется вышестоящей подход ко мне до API unspfixed API приземлился и легко доступен во всех основных браузерах.

Смежные вопросы