iOS Safari:点击'当有一个事件监听器在鼠标移动时,事件不会被触发'

时间:2017-09-04 09:32:55

标签: javascript safari mouseevent

在iOS中的safari上,当它的元素或祖先在mousemove上有一个事件监听器时,它上面的click事件监听器将被忽略。

<div id="el"></div>

document.getElementById("el").addEventListener("mousemove", _e => console.log("mousemove"));
document.getElementById("el").addEventListener("click",     _e => console.log("click"));
在ios上,从未记录点击,在Android(Chrome)或桌面浏览器上都是。

有关于ios点击错误的数十个stackoverflow问题,但我找不到任何关于此组合的信息。

1 个答案:

答案 0 :(得分:1)

以下是Apple自己的文档摘录,描述了iOS上的Safari如何使用触摸输入来模拟鼠标事件:

  

...事件按此顺序到达:mouseovermousemovemousedownmouseupclick。 [...]如果页面内容在mousemove事件中发生更改,则不会发送序列中的后续事件

https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html

换句话说,如果您对mousemove事件处理程序(而不仅仅是简单的console.log())中的DOM进行了一些更改,则click事件将被延迟,根据Apple的规格 回到iPhone的推出时,这就是Apple处理实际鼠标指针可用于悬停效果而触摸不能的事实的方式。

尽管如此,我不确定为什么click事件不会在简单的小提琴中延迟。这些天使用的算法可能更“聪明”,并通过评估内容信息的变化和因素来确定DOM变更是否相关。