为啥在 iOS Safari Mobile (iPhone / iPad) 中没有触发模糊事件?

Posted

技术标签:

【中文标题】为啥在 iOS Safari Mobile (iPhone / iPad) 中没有触发模糊事件?【英文标题】:Why is blur event not fired in iOS Safari Mobile (iPhone / iPad)?为什么在 iOS Safari Mobile (iPhone / iPad) 中没有触发模糊事件? 【发布时间】:2012-11-21 12:06:12 【问题描述】:

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

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

    $("a").focus(function()
        console.log("focus fired");
    );

    $("a").blur(function()
        console.log("blur fired");
    ); 

html

<html>
<form>
    <a href="#">test link</a>
    <div>
    <input type="text" title="" size="38" value="" id="lname1" name="" class="text">
    </div>
    <div style="padding:100px">
        <p>test content</p>
    </div>
</form>
</html>

【问题讨论】:

【参考方案1】:

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

有a complete guide to using javascript events in WebKit on iOS。

【讨论】:

我在developer.apple.com/library/safari/#documentation/… 中发现了一件更有趣的事情,即只有当我点击可点击元素时,才只有锚标签失去焦点。 我已经阅读了发布的指南,但仍然没有看到您如何检测输入元素何时失去焦点?你能发布一个代码示例吗? @ChrisFox 抱歉,我没有任何代码示例。您必须点击另一个表单元素来转移焦点(并在前一个元素上获得模糊事件)。【参考方案2】:

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

$("a").on('touchleave touchcancel', function () 
      // do something
);

为此,您需要更新焦点函数以侦听 click 事件,如下所示

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

【讨论】:

【参考方案3】:

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

$('*').click();
$('html').css('-webkit-tap-highlight-color', 'rgba(0, 0, 0, 0)');

当元素被点击时,第二行移除高亮。

我知道这是次优的,但它可能会让你继续前进。

【讨论】:

不要像这样针对页面上的每个元素。这为每个人提供了一个听众。单身的。多姆。元素。性能太差了。【参考方案4】:

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

android 和 iOS:

Android 三星 S9 上测试 在 iOS iPad 5ºgen 上测试

终于有办法了: 似乎 iPad 将 mouseout 听为模糊,而 android 似乎完美地听了 blur 事件,我只是在这种情况下添加了一个三元以附加正确的事件(以前我的目标是移动或平板设备而不是计算机。

// element >> element you want to trigger
// os >> function that return operative system 'ios' or 'android' in my case

element.addEventListener(os === 'ios' ? 'mouseout' : 'blur', () => 
  // Do something
)

【讨论】:

【参考方案5】:

blur 事件不会触发,因为当您在锚标记之外点击不可点击元素时,iOS 会忽略该点击(并且click 事件不会触发)。

关于这个有几个线程(例如.click event not firing in Chrome on iOS)。您可以通过将cursor: pointer 添加到&lt;body&gt; 或将执行点击的其他元素来修复它。

【讨论】:

以上是关于为啥在 iOS Safari Mobile (iPhone / iPad) 中没有触发模糊事件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Mobile Safari 缓存不会清除?

为啥 Safari Mobile 中无法播放网络音频 api 振荡器?

iOS 7 Safari 干扰 jQuery Mobile 页脚

Dojo Mobile ComboBox 下拉菜单在 iOS8/Safari 中错位

Websql 排队执行 - iOS6 Mobile Safari

iOS 5.1 和 Safari Mobile 限制