iScroll4下表单元素聚焦及键盘的异常问题

 本文是zawa同事写的一篇博文,相信很多在webapp开发中的同学使用iscroll4会遇到的该问题,问过zawa兄的建议,在这里分享给大家,希望能帮助到各位~

原文地址:http://www.zawaliang.com/2013/10/443.html

 

问题:在使用了iScroll4的容器内,当表单元素focus聚焦后键盘出现时,可能会存在iScroll区域高度不更新,滚动异常问题;而且当前聚焦的表单元素可能不出现在可视区域内,影响用户体验。

iKeyboardScroll4就是这么一个解决方案
Github见:https://github.com/zawaliang/iKeyboardScroll4

如今大多数机型都支持onorientationchange事件,iScroll4在不支持onorientationchange事件的机型中使用onresize事件来对滚动区域进行自动刷新操作。所以上面说的表单情况,在大多数机型里都会存在高度不刷新的情况。

RESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize',

那么现在的问题就是检测键盘出现与否,然后调用refresh接口刷新滚动区域高度。由于没有相应的接口来检测键盘状态,所以我们通过onresize来检测窗口高度变化,配合当前元素的聚焦状态来模拟键盘状态。同时需要考虑在键盘出现时翻屏的情况。

由于不确定orientationchange与onresize哪个先触发,而且Android下orientationchange之后获取高度存在时间差,所以这里统一到onresize进行处理。

$(window).on('orientationchange', function(e) {
        _landscape2 = !!(window.orientation & 2);
    }).on('resize', function(e) {
        // 不确定orientationchange与onresize哪个先触发,这里稍微延时
        setTimeout(function() {
           // Android下orientationchange之后获取window值会延时
            if (_landscape != _landscape2) {
                // 屏幕翻转且翻转前键盘处于显示状态时,交换宽高
                if (_display) {
                    var tmpWidth = _initWinWidth;
                    _initWinWidth = _initWinHeight;
                    _initWinHeight = tmpWidth;
                } else {
                    _initWinWidth = $(window).width();
                    _initWinHeight = $(window).height();
                }
            }

            var h = $(window).height();
            _display = _activeElement !== null && _initWinHeight > h;
            $.each(_callback, function(k, v) {
                v.apply(null, [_display, _activeElement]);
            });
            _landscape = _landscape2;
        }, 200);
    });

当存在聚焦元素,且窗口高度比初始化时的窗口高度小时,即认为键盘出现了。

_display = _activeElement !== null && _initWinHeight > h;

键盘的问题解决了,我们需要解决聚焦元素的位置问题,否则可能会出现聚焦元素不在可视区域的情况,用户茫然不知当前输入的是啥。需要注意的是在iOS6下,系统会自动定位到聚焦的元素,但升级后的iOS7就没那么“正常”了,表现的跟Android比较类似,所以我们只对非iOS6以及iOS7的做处理即可。

// 聚焦且键盘显示时,修正输入框位置
// iOS6会自动定位到输入框,但还是需要refresh位置
// iOS7不会自动定位到输入框,表现跟Android类似
if ((!$.os.ios || _ios7)
   && display && focusElement) {
   offset = $.type(offset) == 'number' ? offset : 5;
   var el = $(focusElement),
       winHeight = $(window).height(),
       top = el.height() + el.offset().top + offset;

   // iScrollInstance.y为负值
   if (top - iScrollInstance.y > winHeight) {
      iScrollInstance.scrollTo(0, winHeight - top + iScrollInstance.y, 0);
   }
   // iOS7下聚焦键盘出现后,输入框没聚焦,这里设置下
   _ios7 && focusElement.focus();

}

说到iOS7,还有一个地方比较怪异,当点击输入框,键盘会出现,但是输入框没有聚焦。需要手动再点击一次。初步排查是iScroll4的问题,但没搞懂是哪出问题了,所以iKeyboardScroll4里对这些情况做了处理,暂时解决了这一问题。

移动侧WebApp坑还是比较多,需要不断的积累经验才行啊~

 

 

作者:白树

出处:http://peunzhang.cnblogs.com/

时间: 2024-09-11 00:38:18

iScroll4下表单元素聚焦及键盘的异常问题的相关文章

ASP.NET中实现把form表单元素转为实体对象或集合

这篇文章主要介绍了ASP.NET中实现把form表单元素转为实体对象或集合,本文又是一个对重复数据处理的一个封装,非常实用的开发技巧,需要的朋友可以参考下     简介: 做WEBFROM开发的同学都知道后台接收参数非常麻烦 虽然MVC中可以将表单直接转为集实,但不支持表单转为 LIST<T>这种集合 单个对象的用法: 表单:   代码如下: <input name='id' value='1' > <input name='sex' value='男' >   后台:

表单元素属性readonly和disabled使用对比

表单元素属性readonly和disabled在适应范围.操作.表单提交等等方面都有所不同,至于有哪些不同,感兴趣的朋友可以了解下本文   1)适应范围: readonly:input[type="text"],input[type="password"],input[type="teaxtarea"] disabled:所有的表单元素,如select, radio, checkbox, button等 2)操作: readonly:不允许用户修

CSS表单元素垂直居中完美解决方案

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

jquery 获取表单元素里面的值示例代码

本文为大家详细介绍下通过jquery获取表单元素CheckBox.Radio等的值,有需求的朋友可以参考下,希望对大家有所帮助   jquery 笔记: 复制代码 代码如下: $("input[name='radio_name']:checked").val() <input type="radio" value="1" name="radio_name" />1 <input type="radi

javascript获取form里的表单元素的示例代码

 本篇文章主要是对javascript获取form里的表单元素的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 //获取form对象   var form=document.getElementById('my_form');   //用户名input对象 user_name是对象的name属性   var userName=form.user_name;   //用户名清空   userName.value='';   //用户密码input对象 password是对象的na

jQuery获取和设置表单元素的方法

 本篇文章主要对jQuery获取和设置表单元素的方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 jQuery提供了val()方法,使用它我们可以快速地获取和设置表单的文本框.单选按钮.以及单选按钮的值. 使用val()不带参数,表示获取元素的值 使用val()给定参数,则表示把值赋给元素   如下:     代码如下: //获取值 alert($("input#mytextbox").val()); alert($("select#mylist").v

使用jQuery时Form表单元素ID和name命名大忌

 将自己的表单元素ID和name命名为了nodeName,在chrome浏览器下报错,结果发现是表单元素命名的原因 在做自己的毕业设计的时候将自己的表单元素ID和name命名为了nodeName:  代码如下: <form>    <input type="text" name="nodeName" id="nodeName">    ...........    </form>    在chrome浏览器下可

js函数名与form表单元素同名冲突的问题

 本篇文章主要是对js函数名与form表单元素同名冲突的问题进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 今天在导出Excel的时候用了Form 表单的input hidden 来区分导出和搜索.开始的时候js中的onClick事件的函数名 和 hidden 中的 id 命名一样.结果导致报错:调用函数的那一行对象不支持此属性.   找了很长时间都找不出原因,开始的时候一直以为是写错了某个字母,才发现js函数根本没有执行.后来没有办法直接调用了别的函数,发现就有用了,认为是函数

【原】如何改变表单元素的外观(for Webkit and IE10)

表单元素在网页设计中使用的非常频繁,如文本输入框.单选框.复选框.选择列表.上传文件,它们在浏览器中的展现有自带的外观,为了在视觉上取得更好的产品体验,保持客户端的统一,通常产品经理会提出需要改变它的外观,使用自定义的,对于产品本身来说这样的要求是加分项,开发在力所能及的范围内应该大力支持.做H5移动开发,并没有原生APP开发那样,大部分内容都可以自定义,移动端H5页面受手机系统的影响,不同的浏览厂商对表单元素的渲染效果差异很大. 下图为 iphone4s .魅族 android4.4 .诺基亚