移动端项目前端小结(二)
移动端点击延迟
移动端的点击事件或有300ms延迟,如果用的是jq框架,可以搭配fastclick插件解决延迟问题:
1、下载引入fastclick.js
2、jq版使用
$(function(){ FastClick.attach(document.body); })
若用zepto框架就不用考虑这个问题。
移动端软键盘兼容
1、Android和IOS在唤起键盘和收起键盘大体上是一致的:input控件获得焦点时键盘呼起,失去焦点时键盘收起。
2、但是 键盘起来后,Android和IOS的表现会不一样。一般情况下,IOS的页面会自动往上滚动一点,Android不会。键盘收起后,Android的input控件存在不会失去焦点的情况(比如点击键盘上的收起按钮。);IOS也存在页面没有自动往下滚动还原的情况。
3、如果有元素是定位在页面底部的,键盘呼起后元素会被键盘顶上来,这一点要注意。
4、Android小米浏览器下,输入框依旧被输入法遮挡问题
以下软键盘兼容代码:摘自:1、移动端软键盘兼容方案; 2、 可能这些是你想要的H5软键盘兼容方案
// 判断设备类型 var judgeDeviceType = function () { var ua = window.navigator.userAgent.toLocaleLowerCase(); var isIOS = /iphone|ipad|ipod/.test(ua); var isAndroid = /android/.test(ua); var isMiuiBrowser = /miuibrowser/.test(ua); return { isIOS: isIOS, isAndroid: isAndroid, isMiuiBrowser: isMiuiBrowser } }() // 获取到焦点元素滚动到可视区 function activeElementScrollIntoView(activeElement, delay) { console.log('当前编辑框滚动到可视区域') var editable = activeElement.getAttribute('contenteditable') // 输入框、textarea或富文本获取焦点后没有将该元素滚动到可视区 if (activeElement.tagName == 'INPUT' || activeElement.tagName == 'TEXTAREA' || editable === '' || editable) { setTimeout(function () { activeElement.scrollIntoView(); }, delay) } } // 监听输入框的软键盘弹起和收起事件 function listenKeybord($input,focusCb,blurCb) { if (judgeDeviceType.isIOS) { // IOS 键盘弹起:IOS 和 Android 输入框获取焦点键盘弹起 $input.addEventListener('focus', function () { console.log('IOS 键盘弹起啦!'); // IOS 键盘弹起后操作 执行input聚焦后的动作 focusCb(); //所有定位在页面底部的按钮统一一个类名listenKeybordBtn,键盘弹起后隐藏 $('.listenKeybordBtn').css('display', 'none'); }, false) // IOS 键盘收起:IOS 点击输入框以外区域或点击收起按钮,输入框都会失去焦点,键盘会收起, $input.addEventListener('blur', () => { console.log('IOS 键盘收起啦!'); // IOS 键盘收起后操作 执行input失去焦点后的动作 blurCb(); $('.listenKeybordBtn').css('display', 'block'); // 微信浏览器版本6.7.4+IOS12会出现键盘收起后,视图被顶上去了没有下来 var wechatInfo = window.navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i); if (!wechatInfo) return; var wechatVersion = wechatInfo[1]; var version = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/); if (+wechatVersion.replace(/\./g, '') >= 674 && +version[1] >= 12) { window.scrollTo(0, Math.max(document.body.clientHeight, document.documentElement.clientHeight)); } }) } // Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起 if (judgeDeviceType.isAndroid) { var originHeight = document.documentElement.clientHeight || document.body.clientHeight; window.addEventListener('resize', function () { var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight; if (originHeight < resizeHeight) { console.log('Android 键盘收起啦!'); // 修复小米浏览器下,输入框依旧被输入法遮挡问题 if (judgeDeviceType.isMiuiBrowser) { document.body.style.marginBottom = '0px'; } //所有定位在页面底部的按钮统一一个类名listenKeybordBtn,键盘收起后显示 $('.listenKeybordBtn').css('display', 'block'); blurCb() } else { console.log('Android 键盘弹起啦!'); // 修复小米浏览器下,输入框依旧被输入法遮挡问题 if (judgeDeviceType.isMiuiBrowser) { document.body.style.marginBottom = '40px'; } $('.listenKeybordBtn').css('display', 'none'); focusCb() activeElementScrollIntoView($input, 1000); //键盘弹起编辑框滚动到可视区域 } originHeight = resizeHeight; }, false) } } let phinput=$('input[name="phone"]'); //input控件聚焦和失去焦点有动作时 listenKeybord(phinput[0],function(){ console.log(' 键盘弹起啦!'); //聚焦时的处理 },function(){ console.log('键盘收起啦!'); //失去焦点时的处理 })
以上移动端软键盘兼容代码注意点
部分Android机下表单元素点击、聚焦会自动触发window的resize事件,比如file类型的input发生点击时就会触发。因此,上边的软键盘兼容在只有一个input时运行不会出错;若有多个表单控件绑定点击事件时则需要再进一步兼容。
var listenKeybordFlag='Mi' // 判断设备类型 //... //同上 // 获取到焦点元素滚动到可视区 同上 // 监听输入框的软键盘弹起和收起事件,添加了参数x用以标识当前触发window的resize事件是哪个表单控件 function listenKeybord($input,focusCb,blurCb,x) { if (judgeDeviceType.isIOS) { //IOS部分不变 } // Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起 if (judgeDeviceType.isAndroid) { var originHeight = document.documentElement.clientHeight || document.body.clientHeight; window.addEventListener('resize', function () { var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight; if(listenKeybordFlag==x){ ; }else{ return false; } if (originHeight < resizeHeight) { console.log('Android 键盘收起啦!'); // 修复小米浏览器下,输入框依旧被输入法遮挡问题 if (judgeDeviceType.isMiuiBrowser) { document.body.style.marginBottom = '0px'; } //所有定位在页面底部的按钮统一一个类名listenKeybordBtn,键盘收起后显示 $('.listenKeybordBtn').css('display', 'block'); blurCb() } else { console.log('Android 键盘弹起啦!'); // 修复小米浏览器下,输入框依旧被输入法遮挡问题 if (judgeDeviceType.isMiuiBrowser) { document.body.style.marginBottom = '40px'; } $('.listenKeybordBtn').css('display', 'none'); focusCb() if(listenKeybordFlag==x){ activeElementScrollIntoView($input,100) } } originHeight = resizeHeight; }, false) } } $('#ideatxt').click(function(event) { listenKeybordFlag='ideatxt' }); $('#numDay').click(function(event) { listenKeybordFlag='numDay' }); listenKeybord($('#ideatxt')[0],function(){;},function(){;},'ideatxt') listenKeybord($('#numDay')[0],function(){;},function(){ if(listenKeybordFlag=='numDay'){ //失去焦点的事件 } },'numDay')
IF()条件判断
当条件语句为数字0,空字符串'',undefined,null,false时为假。