美文网首页移动端
input输入框键盘弹起延时问题

input输入框键盘弹起延时问题

作者: 为光pig | 来源:发表于2021-05-17 16:01 被阅读0次

一、移动端click点击事件300ms延迟介绍

在正常情况下,如果不进行特殊处理,移动端在触发点击事件时,会有300ms的延迟。换句话说,当我们在点击移动端页面后不会立即做出反应,而是会等待300ms才会触发click事件。在移动web兴起初期,用户对300ms的延迟没有太大的感觉,但随着用户对交互体验的要求的提高,如今,移动端的300ms延迟严重影响了用户体验。

300ms延迟由来

07年,苹果公司发布首款Iphone前夕,遇到一个问题:当时的网站都是为大屏设计,手机屏幕太小无法正常浏览,于是苹果工程师做了一些约定解决此类问题。
这些约定当中,最为有名的是双击缩放(double tap to zoom),这是产生300ms延迟的根源。
用手指在屏幕上快速点击两次,iOS 自带的 Safari 浏览器会将网页缩放至原始比例。如果用户在 iOS Safari
里边点击了一个链接。由于用户可以进行双击缩放或者双击滚动的操作,当用户一次点击屏幕之后,浏览器并不能立刻判断用户是确实要打开这个链接,还是想要进行双击操作。因此,iOS
Safari 就等待 300 毫秒,以判断用户是否再次点击了屏幕。 鉴于iPhone的成功,其他移动浏览器都复制了 iPhone
Safari 浏览器的多数约定,包括双击缩放,几乎现在所有的移动端浏览器都有这个功能。 由此产生了300ms延迟问题。

解决方案
方案一 禁用缩放

在html文档头部的meta标签中加入如下语句:

 <!-- 1.禁用缩放 user-scalable=no -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">

user-scalable=no表明这个页面不可缩放,也就是浏览器禁用的双击缩放事件并且同时会去掉300ms点击延迟。
但这个方案也有缺点,就是完全禁用了双击缩放,当我们需要放大文字或者图片时无法满足我们的需求。

方案二 封装一个处理函数
//封装tap解决click 300ms 延时
function tap (obj,callback) {
    var isMove = false;//记录手指是否移动
    var startTime = 0;//记录手指触摸的时间
    obj.addEventListerner('touchstart',function(e){
        startTime = Date.now();//记录触摸时间
    })
    obj.addEventListerner('touchmove',function(e){
        isMove = true;//查看手指是否滑动
    })
    obj.addEventListerner('touchend',function(e){
        if(!isMove && (Date.now()-statrTime) < 150){
        callback && callback();
        }
        isMove = false;//取反 重置
        startTime = 0;
    })
};
tap(div,function(){ //执行代码 });

这个代码可以监测元素点击发生时的状态,从而避免300ms的延迟。
但这个方法有一个弊端,一次只能给一个元素去解决问题。

方案三 fastclick插件解决问题

安装fastclick可以使用npm,Component和Bower。另外也提供了Ruby版的gem fastclick-rails以及.NET提供了NuGet package。最直接的可以在页面引入fastclick js文件。如:
fastclick插件下载地址

插件下载后,在页面中直接引入fastclick.js

import FastClick from 'fastclick';
// hack 在ios 11.3移动端页面 input输入框第一次触摸可以弹起键盘,后续再触摸需要很难弹起键盘,或者需要在输入框停一会才能弹起键盘。
FastClick.prototype.focus = (targetElement) => {
  targetElement.focus();
};
if ('addEventListener' in document) {
  document.addEventListener('DOMContentLoaded', () => {
    FastClick.attach(document.body);
  }, false);
}

相关文章

网友评论

    本文标题:input输入框键盘弹起延时问题

    本文链接:https://www.haomeiwen.com/subject/krmjjltx.html