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

Проблемы с сенсорным экраном HTML5 при встраивании в iframe

Я пытаюсь встроить игры HTML5 в iframe для отображения в браузере на мобильных устройствах, таких как iPads и iPhones.

Если вы посещаете их непосредственно на iPad, они работают нормально.

Но если вы вставляете их, используя iframe, тогда, когда вы касаетесь игры, а затем отпускаете, игра приостанавливается.

Есть ли способ остановить это поведение iframe, чтобы они вели себя так, как должны?

Кажется, может быть, фокус теряется, когда вы перестаете трогать, и он думает, что вы свободны и паузы?

Пример

Попробуйте два примера ссылок ниже в эмуляторе, и вы увидите проблему

Код, который я использую (базовый)

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Game</title>
</head>    
<body>

<div>
  <iframe src="http://static.tresensa.com/madcab/index.html?dst=A0000" frameborder="0" scrolling="no" width="960" height="536"></iframe>
</div>

</body>
</html>

Что я пробовал

css стиль для изменения типа взаимодействия

<div style="overflow:auto;-webkit-overflow-scrolling:touch;">
    <iframe src="" height="" height=""></iframe>
</div>

JS для предотвращения по умолчанию

<script>
document.ontouchmove = function(e) {
    e.preventDefault();
};
</script>

... ни помогли

4b9b3361

Ответ 1

В то же время сталкивается с той же проблемой. Кажется, только Safari делает это таким образом в Google Chrome Samsung Galaxay S4, он работает.

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

body{
    -ms-touch-action: none;
    touch-action: none;
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    }

или/и Javascript

document.addEventListener('ontouchstart', function(e) {e.preventDefault()}, false);
document.addEventListener('ontouchmove', function(e) {e.preventDefault()}, false);

из "iframed game" он будет работать и блокировать это поведение (такие вещи, как: touchmoves, touchscroll и т.д. все, что заставляет игру терять фокус). Но все, что есть в iframe, придерживается правил кода там и кажется, не может быть заблокировано, если мы попытаемся добавить это в iframe-сетку.

Единственным обходным решением, о котором я мог думать, является наложение абсолютного невидимого div с более высоким z-индексом и попытка добавить к нему способности. Но я думаю, что в этом случае игра больше не будет реагировать на прикосновение. ИДК...

Ответ 2


Что делать:


На страницу игры вы можете добавить HTML:

<body onload="init()">

или, альтернативно, в JavaScript

document.addEventListener('load', init);

 

Добавьте также следующую JS на страницу игры

window.init = function() {
  window.parent.frameRegister(window.frameElement.id);
}

 

На странице вашего контейнера определите frameRegister в JS:

var frame;
window.frameRegister = function(frameId) {
  frame = window.frames[frameId];
}

 

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

Затем мы будем принудительно нажимать эти события на соответствующий элемент в местоположении вашего дочернего контейнера.

 

В родительском документе (ваш контейнер для iframe)

Добавьте этот JS

var touchEvents = ['start', 'move', 'enter', 'leave', 'cancel', 'leave']; // Make this whichever events you want to pass

for (i = 0, l = touchEvents.length; i<l; i++) {
  document.addEventLister('touch' + touchEvents[i], function(e) {
    e.preventDefault();
    frame.document.elementFromPoint(e.pageX, e.pageY);.dispatchEvent(e);
  }
}

Предположения


  • Ваш iframe имеет тот же размер, что и его содержащий элемент
  • Ваш код используется только для мобильных устройств
    • Если вы используете его для Интернета (в iframe) и как-то заставляете его работать в IE 8 или меньше, вам нужно будет использовать attachEvent и shim elementFromPoint соответственно.

Дополнительные соображения


Если вы используете jQuery

  • Коснитесь событий в jQuery, используя pageX/pageY
  • Этот ответ, скорее всего, не завершен. Необходимо сделать больше вещей, чтобы убедиться, что вы нажимаете правильный элемент.
    • например. Если вы используете какой-либо наложение, необходимо использовать CSS с pointer-events: none; на наложении.