移动端软键盘收起监听

  在移动端进行表单操作时,时常需要监听键盘的收起,从而完成输入的处理。但浏览器并没有提供直接监听软键盘收起的接口,那该如何进行监听能?这里提供监听的兼容方案。

  在安卓下,大部分浏览器在软键盘收起时,会触发resize事件,可以以此来监听;但ios操作系统并不会触发该事件,但大部分浏览器会触发表单的blur事件,所以可以以此为监听点。浏览器的软件盘监听状况如下表所示:

   

软键盘收起事件监听表

  所以,通过监听onResize、onBlur可以实现移动端主流浏览器的软键盘收起操作;无法即时监听到的,可以监听表单项的onblur事件,在表单项失焦时,做相应处理操作[比收起操作延时,但结果一致]。相应代码如下:

  兼容1:监听resize

watchKeybord() {
    let me = this
    let oriWinHeight = window.innerHeight
    window.onresize = function() {
        me.isKeybordAvail = true
        let newHeight = window.innerHeight

        // 阀值大于140判断为键盘收起
        if (newHeight - oriWinHeight > 140) {
            me.oprNum(‘input‘)
        }
        oriWinHeight = newHeight
    }
}        

  其中的me.isKeybordAvail = true,用来标注该浏览器环境下可以使用resize进行监听;另140是一个预估值的阀值,用来排除其他的resize操作。仅resize的高度差大于140时,才被识别为软键盘交互,否则不是。如浏览器的工具栏、搜索栏的隐藏,window的窗口页会有一个较小的变化。

  兼容2:监听失焦blur

setTimeout(function() {
    // 判断是否可用resize监听
    if (me.isKeybordAvail) {
        return
    }
    if (!newValue) {
        me.oprNum(‘input‘)
    }
}, 0)        

其中的isKeybordAvail,是为了判断是否可以通过监听resize处理键盘收起,如果是,则不处理blur。此处使用了setTimeout(function(){}, 0),它的作用是,将失焦操作延迟到下一个事件循环当中,确保resize事件已经触发,isKeybordAvail已经是正确的值。

  总结,如表中,浏览器表现为四种不同的情况,将有不同的处理:

    浏览器类型1:通过resize事件触发;

    浏览器类型2:通过resize事件触发;

    浏览器类型3:通过blur事件触发;

    浏览器类型4:通过延迟的blur事件触发。[并非真正的键盘收起]

  如上,通过兼容使用resize和blur的方法,实现键盘收起的监听。

时间: 2024-10-07 16:44:43

移动端软键盘收起监听的相关文章

Android 软键盘的监听(监听高度,是否显示)

Android官方本身没有提供一共好的方法来对软键盘进行监听,但我们实际应用时,很多地方都需要针对软键盘来对UI进行一些优化. 以下是整理出来的一个不错的方法,大家可以使用. 不过要注意的是,由于是使用ViewTreeObserver来进行监听,所以每次layout有所改变的话,都会触发,所以listner里面如果有改变layout的方法的话,要注意不要陷入无限触发循环了,这时需要加入一些标记值来规避,这个可以参考代码注释 public class SoftKeyboardUtil { publ

js对手机软键盘的监听

js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,focus和blur不会冒泡,这样就可以使用事件代理,处理多个输入框存在的情况. $(document).on('focusin', function () { //软键盘弹出的事件处理 }); $(document).on('focu

关于 edittext 软键盘退出监听解决办法

edittext 有个onCreateInputConnection 的方法,通过它可以自定义一个输入法连接器,那里连接器里面有个方法(finishComposingText)能监听输入完成的动作. public class MyEditText extends EditText{ public MyEditText(Context context) { super(context); } private OnFinishComposingListener mFinishComposingLis

ios ---键盘的监听事件

//在view将要出现的时候重载viewWillAppear方法添加通知 监听事件 keyboardWillShow:  keyboardWillHide: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:

移动端 软键盘 弹出时 影响布局

移动端 软键盘 弹出时 会影响布局 1)前段时间作的移动端页面,因为高度只有1页所以用了height:100%;width:100%; ios下点击输入框弹出软键盘时,布局没有大影响. 当输入框可能被软键盘压到时,在一部分安卓下却出了问题,华为自带浏览器和UC会有布局上的问题. 原因可能是因为,软键盘弹出时,改变了height,使height:100%,不能达到原来的高度. 解决办法: $(document).ready(function () { $('body').height($('bod

java鼠标与键盘事件监听

package cn.stat.p3.windowdemo; import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.TextField; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt

移动端界面devicePixelRatio问题与移动端软键盘keyCode

现在移动端颗粒度越来越小,所以清晰度很高,如华为p9的devicePixelRatio为4, 这是有多变态,devicePixelRatio是物理像素/逻辑像素=倍率devicePixelRatio,所以 如倍率为4,一个像素在设备上放大了4倍,所以真实4像素是很难在设备上展示出现的, 只能使用缩放等手段去实现,这就像为什么1px边框很难在设备实现一样,现在设备都是 倍率为2,所以经常在网上看到缩小0.5的css方式,这也是为什么经常可以看到一些UI设计图 会有@3x\@2x等图片设计,因为兼容

键盘-App监听软键盘按键的三种方式

前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE_ENTER键(右下

安卓移动端软键盘弹出问题解决方案

移动端开发难免拿到输入框居中或者位于底部的情况,ios 端,软键盘能够按正常预期向上滑动(这里有个问题,当 input 聚焦时,弹出软键盘,input 上滑,此时屏幕是具有滚动效果的,还没找到合适的解决方案),Android 端,并不会滑动,通常做法是设置 window.scrollTo(0, virtualKeyboard.Height), 但是如果你的 input 所在的 div 是绝对定位的话,window.scrollTo 这个事件是监听不到的,这里给出另一套解决方案 self.refs