Javascript 为什么iOS Safari Mobile(iPhone/iPad)没有触发模糊事件?

Javascript 为什么iOS Safari Mobile(iPhone/iPad)没有触发模糊事件?,javascript,iphone,html,ios,ipad,Javascript,Iphone,Html,Ios,Ipad,我有两个事件处理程序绑定到锚标记:一个用于聚焦和模糊 处理程序在桌面上启动,但在iphone和ipad中,只有focus正确启动。如果在锚定标记外单击,则不会触发模糊(仅当单击页面中的其他表单元素时才会触发模糊): HTML: 测试内容 如果某个锚点附加了任何事件,在iOS中第一次点击它会导致锚点进入悬停状态并聚焦。轻触可移除悬停状态,但链接仍保持聚焦。这是故意的。要在iOS上正确控制应用程序,您需要实现基于触摸的事件,并对这些事件做出反应,而不是桌面事件 有。这是一个黑客攻击,但是你可以通过

我有两个事件处理程序绑定到锚标记:一个用于聚焦和模糊

处理程序在桌面上启动,但在iphone和ipad中,只有focus正确启动。如果在锚定标记外单击,则不会触发模糊(仅当单击页面中的其他表单元素时才会触发模糊):

HTML:


测试内容


如果某个锚点附加了任何事件,在iOS中第一次点击它会导致锚点进入悬停状态并聚焦。轻触可移除悬停状态,但链接仍保持聚焦。这是故意的。要在iOS上正确控制应用程序,您需要实现基于触摸的事件,并对这些事件做出反应,而不是桌面事件


有。

这是一个黑客攻击,但是你可以通过在每个DOM元素上注册一个点击处理程序来触发.blur。这将从以前聚焦的元素中移除焦点

$('*').click();
$('html').css('-webkit-tap-highlight-color', 'rgba(0, 0, 0, 0)');
第二行在单击图元时删除高亮显示


我知道这是次优的,但它可能会让你走。

如果你使用触摸设备,你可以使用touchleavetouchend事件来处理用户在区域外单击的情况

$("a").on('touchleave touchcancel', function () {
      // do something
});
要使此功能正常工作,您需要更新焦点功能,以侦听“打开”单击事件,如下所示

$("a").on("click", function (e) {
      if(e.handled !== true) {
            e.handled = true
      } else {
            return false
      }
      // do something
 })

我已经检查了@NicholasShanks答案中的所有文档,但是测试所有事件时有点沮丧

Android和iOS:

  • 在Android上测试三星S9
  • 在iOS上测试
最后,我得到了一个解决方案: iPad似乎将mouseout视为模糊,android似乎完美地聆听了模糊事件,我只是在这个案例中添加了一个三元组来附加正确的事件(以前我的目标是移动或平板设备,而不是计算机)

//元素>>要触发的元素
//os>>在我的例子中返回操作系统“ios”或“android”的函数
元素。addEventListener(os=='ios'?'mouseout':'blur',()=>{
//做点什么
})

模糊事件不会触发,因为当您在不可单击元素的锚定标记外单击时,iOS会忽略该单击(并且
单击事件不会触发)


有几个线程与此相关(例如)。您可以通过将
光标:指针
添加到
或其他将执行单击的元素来修复它。

我在中发现了另一件有趣的事情,那就是仅当我单击可单击元素时,锚定标记才会失去焦点。我已经阅读了发布的指南,仍然看不到如何检测输入元素何时丢失What’s lost focus?你能发布一个代码示例吗?@ChrisFox抱歉,我没有任何代码示例。你必须点击另一个表单元素来转移焦点(并在上一个表单元素上获得一个模糊事件)。不要像这样针对页面上的每个元素。这会为每个.Single.Dom.element都设置一个侦听器。这对性能非常糟糕。
$("a").on('touchleave touchcancel', function () {
      // do something
});
$("a").on("click", function (e) {
      if(e.handled !== true) {
            e.handled = true
      } else {
            return false
      }
      // do something
 })