javascript - iFrame 中的触摸事件在 iOS 上不起作用

标签 javascript ios iframe touch-event

在 iOS 设备上附加到 IFrame 内的窗口时,不会触发像 touchstarttouchend 这样的触摸事件。

这是一个非常简单的例子:

parent.html

<!DOCTYPE HTML>
<html style="height: 100%;">
<head>
    <meta charset="UTF-8">
    <title>Touch Test</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body style="height: 100%; margin: 0; overflow: hidden;">
    <iframe style="width: 100%; height: 100%; border: none;" src="child.html"></iframe>
</body>
</html>

child.html

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>Touch Test</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <style>    
        body {
            margin: 0;
            padding: 8px;
        }

        div.header {
            margin-bottom: 8px;
        }

        div.text-entry {
            font: 300 1rem/1.25 'Open Sans', 'Helvetica Neue', helvetica, arial, sans-serif;
            color: rgb(64, 64, 64);
        }
    </style>

    <script>
        window.onload = function() {
            function addEvent(event) {
                var div = document.createElement('div');

                div.className = 'text-entry';
                div.textContent = new Date().toLocaleTimeString() + ' Event "' + event.type + '" detected';
                document.body.appendChild(div);
            }

            window.addEventListener('touchstart', addEvent.bind(null), false);
            window.addEventListener('touchend',   addEvent.bind(null), false);
        }
    </script>
</head>
<body>
    <div class="text-entry header">Clicks/touches on the viewport should add some text entries...</div>
</body>
</html>

我发现了多个关于 iOS 上 IFrame 滚动问题的问题和一些关于事件的问题,但似乎没有一个有效的解决方案可以解决我现在遇到的问题。

我创建了一个 CodePen和一个 JSFiddle每个人都可以玩,因为它们都在 IFrame 中执行代码,所以表现出完全相同的行为。

最佳答案

解决方案 1: 在 iframe 中,将虚拟监听器添加到 document 对象:

document.addEventListener('touchstart', {}); // in iframe

IOS 上的 Safari 似乎拒绝对 window 的触摸监听器,除非其他 DOM 对象也有监听器。

解决方案 2: 在顶部窗口内,向任何对象(包括 window)添加一个虚拟监听器:

window.addEventListener('touchstart', {}); // in top window

似乎 IOS 上的 Safari 拒绝触摸监听器到 iframe 中的窗口,除非父级也有监听器。

上述任一解决方案都有效(不需要同时使用,只需一个)。 测试于:

  • Safari 9.0/IOS:9.3.5
  • Safari 11.0/IOS:11.3

关于javascript - iFrame 中的触摸事件在 iOS 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41869122/

相关文章:

javascript - 如何在图表上有两个以上数字的 Chartjs 中的 xAxe 上仅显示 2 个数字? (折线图)

javascript - Node.js 模块级变量未定义

ios - 捕获没有压缩的 UIImage(来自 CMSampleBufferRef)?

ios - 在 Objective-C 中调试简单的函数

javascript - 如何在iframe中控制img的宽度

javascript - Node Js中TCP连接中套接字的.on函数是什么

javascript - ES6 相当于这个 Angular 2 typescript

ios - 尝试显示从一个 View Controller 捕获的 UIImage,并在 iOS 中的另一个 View Controller 中显示它

javascript - 从 Iframe 调用 EXTjs 中的父 Controller 函数

javascript - 在 Angular 7 中嵌入 iframe 是否有安全的方法?