Движение мыши не срабатывает, когда любая клавиша удерживается в полноэкранном режиме + блокировка указателя

При нажатии кнопки ввода на странице с приведенным ниже кодом страница перейдет в полноэкранный режим с блокировкой указателя. Перемещение мыши вызовет вывод команды mousemove на консоль. Ключевые события работают нормально, хотя я вырезал ключевые события в полноэкранном режиме, чтобы упростить пример. Моя проблема в том, что если удерживать любую клавишу, а затем перемещать мышь, событие mousemove не срабатывает. Это проблема для полноэкранного режима от первого лица, поскольку это означает, что пользователь не может двигаться и смотреть одновременно! Протестировано в Firefox 23 и Chrome 29, 30 и 31.

Обновление: это происходит только со встроенной сенсорной панелью и/или пером на моем Dell Latitude E6510. Если я подключаю USB-мышь, она работает нормально.

Приветствуются идеи о том, почему это происходит и/или как это решить.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <script>
var isPointerLockSupported = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;
var isFullScreenSupported = 'fullScreenEnabled' in document || 'mozFullScreenEnabled' in document || 'webkitFullscreenEnabled' in document;

function rPL(element, onEnter) {
  var pointerlockchange = function (event) {
    if (document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element) {
      onEnter.call(element, event);
    }
    else {
      document.removeEventListener('pointerlockchange', pointerlockchange, false);
      document.removeEventListener('mozpointerlockchange', pointerlockchange, false);
      document.removeEventListener('webkitpointerlockchange', pointerlockchange, false);
    }
  };
  document.addEventListener('pointerlockchange', pointerlockchange, false);
  document.addEventListener('mozpointerlockchange', pointerlockchange, false);
  document.addEventListener('webkitpointerlockchange', pointerlockchange, false);

  element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
  element.requestPointerLock();
}

function rFS(element, onEnter) {
  var fullscreenchange = function(event) {
    if (document.fullScreenElement || document.mozFullScreenElement || document.webkitFullscreenElement) {
      onEnter.call(element, event);
    }
    else {
      document.removeEventListener('fullscreenchange', fullscreenchange, false);
      document.removeEventListener('mozfullscreenchange', fullscreenchange, false);
      document.removeEventListener('webkitfullscreenchange', fullscreenchange, false);
    }
  }
  document.addEventListener('fullscreenchange', fullscreenchange, false);
  document.addEventListener('mozfullscreenchange', fullscreenchange, false);
  document.addEventListener('webkitfullscreenchange', fullscreenchange, false);

  element.requestFullScreen = element.requestFullScreen || element.mozRequestFullScreen || element.webkitRequestFullScreen;
  element.requestFullScreen(typeof Element.ALLOW_KEYBOARD_INPUT === 'undefined' ? undefined : Element.ALLOW_KEYBOARD_INPUT);
}

document.addEventListener('mousemove', function() {
  console.log('mousemove');
}, false);

document.addEventListener('keydown', function(e) {
  if (e.keyCode == 13 && isFullScreenSupported && isPointerLockSupported) {
    var instructions = this;
    rFS(document.body, function() {
      rPL(document.body, function() {});
    });
  }
}, false);
    </script>
  </body>
</html>

person IceCreamYou    schedule 26.08.2013    source источник


Ответы (1)


Единственная проблема с сенсорной панелью - ваша подсказка. Попробуйте перехватить события ommousedown и onmouseup. Одно из ваших событий запускает это поведение, поэтому вы не хотите, чтобы событие срабатывало при нажатии мыши - только события onclick или onmouseup.

person BashTheKeyboard    schedule 11.03.2014
comment
Вы предполагаете, что если браузер находится в полноэкранном режиме + режим блокировки указателя на этой конкретной модели ноутбука и нажата клавиша, то перемещение моего пальца по коврику для мыши вызывает события mousedown/mouseup, которые каким-то образом предотвращают запуск mousemove. Я полагаю, это возможно. Прошло некоторое время с тех пор, как я работал над этим проектом, и я не мог воспроизвести проблему с другими настройками, поэтому просто проигнорировал ее. Я предполагаю, что у ноутбука просто есть недостаток. - person IceCreamYou; 17.03.2014