本文主要讲述刚接触移动端的开发人员可能遇到的一些坑。
移动端的Click事件
click事件,对于移动端的兼容性不是很好,有的设备上可能会失效问题。
有时候在由于一些原因,需要在 li 标签上添加点击事件,这时候使用click点击事件就可能会失灵。即点击非 a 链接或 button 按钮的时候,click事件不起作用。
click事件触发机制为:touchstart -> touchend -> click
解决方法:
touchend
使用touchend代替click(不推荐)
1 2 3
| $(document).on('touchend','#btn',function(){ //add event code... })
|
touchend事件不推荐使用,因为:touchend事件在页面滚动时有个问题。在滚动完成后,如果当前触点的位置所指的元素绑定了touchend事件,这时便会触发该元素的touchend事件,造成误操作。
tap
使用tap代替click(常用,推荐)
这里有一个需要注意的地方,就是js的原生事件中是没有tap事件的,需要用jq框架或mui等框架封装的tap事件。
1 2 3
| $(document).on('tap','#btn',function(){ //add event code... })
|
css
给需要点击的标签添加CSS属性。
比如需要点击ul列表中的每个li项,可以给 li 添加 css 属性,使其支持click点击事件
1
| ul > li {cursor:pointer;}
|
这个方法我这边使用目前没出现什么问题,不清楚具体的浏览器内核解析过程。
移动端适配rem
移动端的适配一直以来,对开发人员就是一个比较难以解决的问题,我也只是把我接触过的适配方法写下来:
首先就是每个页面必须的声明部分
1
| <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
简单适配
适配代码需要放在css文件引入之前运行。css单位使用rem.
1 2 3 4 5 6 7 8 9 10 11 12 13
| window.onload = function(){ /*720代表设计师给的设计稿的宽度,你的设计稿是多少,就写多少;100代表换算比例,这里写100是 为了以后好算,比如,你测量的一个宽度是100px,就可以写为1rem,以及1px=0.01rem等等*/ getRem(720,100) }; window.onresize = function(){ getRem(720,100) }; function getRem(pwidth,prem){ var html = document.getElementsByTagName("html")[0]; var oWidth = document.body.clientWidth || document.documentElement.clientWidth; html.style.fontSize = oWidth/pwidth*prem + "px"; }
|
小米官网写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| !function(n){ var e=n.document, //获取document t=e.documentElement, //获取根节点html i=720, //初始值720px d=i/100, //假设100px为1rem,那么720px为7.2rem o="orientationchange"in n?"orientationchange":"resize", //判断是否有改变横屏事件,没有的话用resize事件 a=function(){ var n=t.clientWidth||320; //获取手机屏幕宽度 n > 720 && (n=720), //手机屏幕宽度大于720px默认设置为720px,即最大宽度为720px t.style.fontSize=n/d+"px" //设置根元素的字体大小为手机屏幕宽度/7.2,为上面自己定义的,当然你可以定义成别的,8.2,9.4都行 }; e.addEventListener && (n.addEventListener(o,a,!1), //判断是否有addeventlistener方法,如果有,就绑定上面判断的o事件 e.addEventListener("DOMContentLoaded",a,!1)) //绑定DOMContentLoaded事件 }(window);
|
微信分享的缩略图和简介
官方文档链接 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115
声明shareWx方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| function shareWx(url,img,title,desc,callBack){ $.ajax({ url: '******', //获取微信公众平台的各种参数接口 type: "POST", data: { url: window.location.href, appid: "****" //微信公众号的appid }, dataType: "json", success: function (data) { if (data.nonceStr != null && data.nonceStr != "") { wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: data.appId, // 必填,公众号的唯一标识 timestamp: data.timestamp, // 必填,生成签名的时间戳 nonceStr: data.nonceStr, // 必填,生成签名的随机串 signature: data.signature,// 必填,签名,见附录1 jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage', 'hideAllNonBaseMenuItem', 'showMenuItems','addCard'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); //分享链接的缩略图 var imgUrl = img; //分享链接的链接地址 var lineLink = url; //分享链接的描述信息 var descContent = desc; //分享链接的标题 var shareTitle = title; //一般为空就可以 var appid = ''; //分享给好友 wx.ready(function () { wx.onMenuShareTimeline({ title: shareTitle, // 分享标题 link: lineLink, // 分享链接 imgUrl: imgUrl, // 分享图标 success: function () { // 用户确认分享后执行的回调函数 if(typeof callBack == "function"){ callBack(); } }, cancel: function () { // 用户取消分享后执行的回调函数 } }); wx.onMenuShareAppMessage({ title: shareTitle, // 分享标题 desc: descContent, // 分享描述 link: lineLink, // 分享链接 imgUrl: imgUrl, // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 if(typeof callBack == "function"){ callBack(); } }, cancel: function () { // 用户取消分享后执行的回调函数 } }); wx.hideAllNonBaseMenuItem(); wx.showMenuItems({ menuList: ['menuItem:share:appMessage','menuItem:share:timeline'] // 要显示的菜单项,所有menu项见附录3 }); }); wx.error(function (res) { //alert("验证不通过"); // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。 }); } } }); }
|
调用分享的方法,调用前需要在页面先引入微信官方提供的js
1 2 3 4 5 6 7 8
| // 页面引入 <script src="//res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> //页面引入js文件 // 调用方法 var url = "***"; //分享链接的URL var img = "test.jpg"; //分享的缩略图 var title = "***"; //分享链接的标题 var content = "****"; //分享链接的描述信息 shareWx(url, img, title, content); //调用方法
|
附录1:JS-SDK使用权限签名算法
附录2:所有JS接口列表
附录3:所有菜单项列表
video视频播放问题
有的视频,使用video标签播放的时候,Android端可以播放,但IOS端有时候不能播放视频。
可以转换为 .mp4 格式。
不过有时候 .mp4 格式可能也会无法播放,这是因为 mp4 格式中,视频编码方式也需要设置正确。
这里我用【格式工厂】软件来说明。
格式工厂 -> mp4 -> 输出配置 -> 视频编码:AVC(H264)
清除微信H5缓存
之前在调试开发的过程中,遇到一个问题,就是:无论怎样刷新微信页面,或者重启web服务器,都无法清除缓存的css和js数据。
现在推荐2种不同手机的清除缓存方法,用来清除微信浏览器缓存。
IOS端
- IOS端浏览器内置的刷新,貌似可以清除css和js缓存,我这边测试的时候,是可以清除缓存的。
- IOS端:我 -> 设置 -> 通用 -> 微信存储空间 -> 清理微信缓存。即可清除缓存。
今天(2018/06/29)遇到了点击“清理微信缓存”后,返回去查看页面还是没有变化的问题,后来多点了几次页面右上角的刷新,就解决了。
Android端
在微信浏览器访问 http://debugx5.qq.com (X5 调试页面),然后滚动到页面最下面。
勾选 Cookie, 文件缓存, 广告过滤缓存, DNS缓存 ,然后点击右侧的 “清除” 按钮。即可清除缓存。
注意:此方法不适用于IOS端。
微信H5的a链接点击失灵
微信内置浏览器的 a 链接,来回跳转几次就出现了跳转加载进度条,但是就是不跳转,也没有任何反应的情况。
解决办法:
给 a 链接的 href 属性添加任意参数,例如:
1
| <a href="www.baidu.com?2018"></a>
|
就可以解决 a 链接不跳转的问题。
IOS端长按屏幕变暗
IOS端的微信H5页面,有时候长按 div 或带有 background-image 的时候,屏幕会变暗.
解决办法:
给CSS添加以下属性:
1
| * { -webkit-tap-highlight-color:transparent;}
|
即可解决上述问题。
audio音乐标签的方法调用
使用jq或者zepto时,想要调用音乐的play()方法时,发现 $(“#audio”).play(); 不起作用,并且报错 play()方法 undefined。
解决办法:
使用原生document方法即可调用
1 2 3
| var audio = document.getElementById('audio'); audio.play(); audio.stop();
|
IOS的alert弹窗有域名
微信内置的H5浏览器,在IOS端的alert()弹框会带上域名,很影响页面美观。在Android端不会带上域名。
解决办法:
在js中加上如下代码,重置window的alert()方法。
1 2 3 4 5 6 7 8
| window.alert = function(name){ var iframe = document.createElement("IFRAME"); iframe.style.display="none"; iframe.setAttribute("src", 'data:text/plain,'); document.documentElement.appendChild(iframe); window.frames[0].window.alert(name); iframe.parentNode.removeChild(iframe); };
|
IOS的H5页面text-decoration无效
微信内置的H5浏览器,在IOS端CSS中的 text-decoration 属性不生效,在Android端显示正常。
解决办法:
添加 -webkit- 前缀
1 2 3 4
| .test{ -webkit-text-decoration: underline solid text-decoration: underline solid }
|
以上是我在开发过程中遇到的问题,后续再更新。。。