前端常见兼容问题系列8: 安卓机器中通过JS设置焦点无法拉起软键盘

简介: 有时候,为了优化用户体验,做交互设计的同学可能会希望让输入框自动获得焦点并弹出软键盘,这样用户不用点击输入框就可以直接输入。的确,这对用户来说很方便。但真正用HTML5页面去实现的时候,却遇到了问题。 首先我做了这样一个demo。 ``` Title #input1{

有时候,为了优化用户体验,做交互设计的同学可能会希望让输入框自动获得焦点并弹出软键盘,这样用户不用点击输入框就可以直接输入。的确,这对用户来说很方便。但真正用HTML5页面去实现的时候,却遇到了问题。

首先我做了这样一个demo。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no, address=no, email=no, time=no">
    <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0">
    <title>Title</title>
    <style>
        #input1{
            width: 200px;
            line-height: 30px;
        }
    </style>
</head>
<body>
    <input id="input1" type="text">
    
    <script>
        document.getElementById('input1').focus();
    </script>
</body>
</html>

在iOS的机器上试验,可以实现需求。但在多台安卓机器上测试时,都发现无法拉起来软键盘。

接着我尝试了给input输入框加上autofocus属性、或者给 document.getElementById('input1').focus();加上延时执行,也都无效。

之后,我又尝试把<input id="input1" type="text">换成一个<div contenteditable="true" id="input1"></div>,再用JS控制它自动获得焦点,事实证明也是无效的。

最后找到一个可以部分解决问题的办法,就是通过一个按钮的click()方法去触发input框的focus()方法。代码清单如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no, address=no, email=no, time=no">
    <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0">
    <title>Title</title>
    <style>
        #input1{
            width: 200px;
            line-height: 20px;
            border: 1px solid #b2b2b2;
            padding: 5px;
        }
    </style>
</head>
<body>
    <input id="input1" type="text">

    <button id="btn">focus</button>

    <script>
        var btn = document.getElementById('btn');

        btn.onclick = function () {
            document.getElementById('input1').focus();
        }
    </script>
</body>
</html>

这个办法可以解决在点击一个按钮,不跳转页面的情况下打开一个弹层,让弹层中的输入框自动获得焦点并拉起软键盘的问题。注意,这里的点击按钮事件是需要手动触发的。如果不手动点击按钮,则即便用JS去触发按钮点击事件,也是不能拉起软键盘的。至于点击按钮后跳转到一个新页面的场景,用这种办法也是无法cover到的。

最后,顺便提一下,有一个方法可以在进入页面时就通过JS拉起软键盘,那就是进入页面时自动执行window.propmt()这个JS语句。遗憾的是,由于window.propmt()弹出的界面不可定制,实在太不美观,因而使用场景非常之有限。

目录
相关文章
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
675 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
12月前
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
439 8
|
JavaScript 前端开发 容器
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
12636 23
|
JavaScript 前端开发
|
存储 JavaScript 前端开发
|
移动开发 JavaScript 前端开发
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
874 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
存储 JavaScript 前端开发
|
JavaScript 前端开发