**问题:**满心欢喜写好提交代码,测试告诉我,苹果手机在完成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个数相等,即页面上所有输入框已失去焦点,然后让页面还原即可。
**结语:**代码比较冗杂,希望有大神指点优化,有疑问或者想法的也可在评论留言讨论,欢迎大家指点