Javascript touch не работает в Mobile Safari - программирование
Подтвердить что ты не робот

Javascript touch не работает в Mobile Safari

Я пытаюсь запретить пользователю прокручивать, если они касаются iframe. Поэтому, если они касаются тела, они могут прокручиваться.

Интересно, почему ниже код работает отлично в Mobile Chrome, но не работает в Mobile Safari. Любой способ исправить это для сафари?

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
        <style>
            .overflowHidden {
                position:relative;
                overflow-y:hidden;
            }
            .overflowAuto {
                -webkit-overflow-scrolling: touch;
                overflow: auto;
            }
        </style>
    </head>
    <body>
        <section>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
            <iframe id="appSimulator" style="background: #000000;" width="189px" height="400px" frameborder="0" scrolling="no"></iframe>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
        </section>
        <script type="text/javascript">
            document.body.addEventListener('touchstart', function(){
                document.body.style.overflow="auto";
                $('body').removeClass('overflowHidden');
                $('body').addClass('overflowAuto');
            }, false)
            document.body.addEventListener('touchend', function(){
                document.body.style.overflow="hidden";
                $('body').removeClass('overflowAuto');
                $('body').addClass('overflowHidden');
            }, false)
        </script>
    </body>
</html>

РЕДАКТИРОВАТЬ

Пример для мобильного Chrome - это то, что я хочу в Safari mobile

enter image description here

Благодарю.

EDIT 2

Спасибо за помощь от муэки.

Вот текущий результат от Safari Mobile

enter image description here

Текущий код

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <style>
            body {
                -webkit-overflow-scrolling: touch;
            }
            .iframeContainer, iframe {
                width: 189px;
                height: 405px;
            }
            .iframeContainer {
                overflow: auto;
            }
        </style>
    </head>
    <body>
        <section>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
            <div class="iframeContainer">
                <iframe id="appSimulator" src="https://appetize.io/embed/keyyyyyyy?device=iphone5s&scale=50&autoplay=false&orientation=portrait&deviceColor=black&language=zh-Hant" frameborder="0" scrolling="no"></iframe>
            </div>
            <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
        </section>
    </body>
</html>

если я установил .iframeContainer { overflow: hidden; } .iframeContainer { overflow: hidden; }

enter image description here

4b9b3361

Ответ 1

Основная проблема с iOS Safari заключается в том, что тег iframe рассматривается как некоторый отзывчивый элемент и будет действовать странно по размеру и содержать элементы (загруженные HTML). Я тестировал с использованием iframe с реальным контентом, поэтому он будет полностью прокручиваться. Используя тот же код, что и в вашем примере, Safari iOS показал iframe с полной высотой содержащегося в нем содержимого содержимого html с определенной width и height.

Чтобы решить проблему, вам нужно включить iframe в контейнер block, а затем установить размер контейнера блока (width и height) и overflow в auto и добавить атрибут поставщика в тело, чтобы позволить iframe правильно прокручиваться. Кроме того, не забудьте установить iframe как прокручиваемое.

Вы можете отказаться от реализации js.

Я тестировал это на каждом настольном браузере, Safari iOS и Mobile Chrome.

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

Надеюсь, поможет.

Основной html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <style>
        body {
            -webkit-overflow-scrolling: touch;
        }
        .iframeContainer, iframe {
            width: 200px;
            height: 200px;
        }
        .iframeContainer {
            overflow: auto;
        }
    </style>
</head>
<body>
    <section>
        <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
        <div class="iframeContainer">
            <iframe id="appSimulator" frameborder="0" src="scrolling.html" scrolling="yes"></iframe>
        </div>
        <p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p><p>hello</p>
    </section>
</body>
</html>

Загруженный iframe:

    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <style>
        body {
            background-color: black;
            color: white;
        }
    </style>
</head>
<body>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
    <p>hello</p>
</body>
</html>

Ответ 2

Кажется, сенсорное событие работает хорошо, но переполнение не происходит.
Я не уверен, как выглядит ваш html, но вы можете попробовать:

  1. скрытых:
    body {/* position can be fixed */position:relative; overflow-y:hidden; }

  2. авто:
    body { -webkit-overflow-scrolling: touch; overflow: auto; }