处理苹果手机输入完成后页面不回弹问题

265 阅读2分钟

**问题:**满心欢喜写好提交代码,测试告诉我,苹果手机在完成input框的输入后,页面竟然不能回弹,然后面向百度开发,这个问题非常常见,我选用了猿友重新定位的方法解决问题,OK,下机下班!又过不久,测试反馈,页面是回来了,但是每当一个输入框输完之后,页面就会回去一次(即重新定位一次)。借了同事的苹果试了下,确实体验极差,且会导致位于底下的输入框被键盘挡住,不是很友好。 

**解决思路:**监听当前页面所有的可输入框(input和textarea),当页面上所有的输入框都失去焦点时,再进行重新定位。

** 实现过程:**实现过程比我想象的要复杂不少,当前页面输入框很多,既有input也有textarea,还有多个select选择框,这些标签都是交错在HTML中,且提供了添加按钮,该表单还能不断添加,也就是说页面可能会很长,如何动态监听所有的输入框?且实测发现,如果在输入框切换选择框的时候也会导致页面异常,在某个输入框获取焦点的时候,上下滑动页面也可能会导致页面异常。直接上代码

function inputBlurBackPage(className1, className2) {    //传参为空时取默认值    var sonClass = className1 || ".input-box";    var fatherClass = className2 || ".form-input-group";    var num = $(sonClass).length;    $("select").off("blur").on("blur", function () {        $("input").blur();        $("textarea").blur();    })    if (num == 0) {        return;    }    $(sonClass).each(function () {        var that = this;        $(that).off("focus").on("focus", function () {            $(that).removeClass("input-blur");            document.body.addEventListener('touchmove', function (e) {                $(that).blur();            }, { passive: false }) //passive防止阻止默认事件不生效        });        $(that).off("blur").on("blur", function () {            $(that).addClass("input-blur");            var backTime = setTimeout(function () {                var mainPage = window.parent;                var hiddArr = $(that).parents(fatherClass).find(".input-blur");                if (hiddArr.length == num) {                    mainPage.scrollTo(0, 0);                    clearTimeout(backTime);                }            }, 50);        });    })}

**实现思路:**监听上面说的种种可能导致定位异常的其他标签,触发时让输入框失去焦点。然后给所有的可输入标签增加两个类名,className1即为需要处理的输入框类名,className2为是否有焦点存在作为判断的条件,这样只需要知道当前页面的className1类名个数与失去焦点时当前页面的className2个数相等,即页面上所有输入框已失去焦点,然后让页面还原即可。

**结语:**代码比较冗杂,希望有大神指点优化,有疑问或者想法的也可在评论留言讨论,欢迎大家指点