前端学习--Vue+H5开发APP踩坑

1、长按按钮N秒后触发函数
实现步骤:
(1)手指按在按钮范围时开始一个定时器,设置两个变量,其中一个记录按下的时间,每过一秒就加1,另一个记录手指是否有移动过
(2)手指按下后,如果手指有移动则清除定时器,变量设置为0
(3)手指抬起,清除定时器,判断变量值与N是否相等

<button id='actionState'>长按N秒后触发函数</button>

//全局变量
let longClick = 0; 
let isMove = false; 
mounted(){
   	let vm = this;
    let state = document.getElementById('actionState');
    /* 手指按下 */
    state.addEventListener("touchstart", function(e) {
        longClick=0;//设置初始为0
        timeOutEvent = setTimeout(function() {
            longClick = 1;
        }, 1000);
    }, false);
    /* 手指移动*/
    state.addEventListener("touchmove", function(e) {
        clearTimeout(timeOutEvent);
        isMove = true;
        //该方法将通知 Web 浏览器不要执行与事件关联的默认动作
        e.preventDefault();
    }, false);
    /* 手指抬起*/
    state.addEventListener("touchend", function(e) {
        clearTimeout(timeOutEvent);
        //N指长按的秒数
        if(isMove == false && longClick == N){	
             //执行相关函数代码
        }
    }, false);
}

2、利用画布给图片添加水印
实现步骤:
(1)用异步方式去处理函数
(2)图片base64作为函数参数传入
(3)创建一个画布,并且隐藏起来
(4)注意:在图片加载完成后才将图片放入画布
(5)利用canvas提供的方法在画布里添加图形、文字等
(6)将画好的画布转为base64

addMakerToImage(base64,'需要在画布上添加的文字');

function addMakerToImage(url, text){
	return new Promise((resolve, reject) => {
        try {
            let img = new Image();
            //创建画布
            if (document.getElementById('myCanvas')) {
                document.documentElement.removeChild(document.getElementById('myCanvas'));
            }
            let watchCanvas = document.createElement('canvas');
            watchCanvas.id = 'myCanvas';
            //将创建好的画布隐藏起来
            watchCanvas.style.visibility = 'hidden';
            watchCanvas.style.position = 'absolute';
            watchCanvas.style.top = '0';
            watchCanvas.style.left = '-1000px';
            watchCanvas.style.zIndex = '-1';
            watchCanvas.style.opacity = '0';
            document.documentElement.appendChild(watchCanvas);
            let c = document.getElementById('myCanvas');
            let ctx = c.getContext('2d');
            img.onload = () => {
            //图片加载完成
            //画布的宽高跟图片的宽高一样
                watchCanvas.width = img.width;
                watchCanvas.height = img.height;                
                ctx.drawImage(img, 0, 0, img.width, img.height);
                //设置画布文字的样式
                ctx.font = `bold ${img.height * 0.05}px Arial`;
                ctx.fillStyle = '#ff0000';
                ctx.fillText(id, 10, 80);
                ctx.fillText(time, 10, 200);
                setTimeout(() => {
                //画布转图片
                    resolve(Canvas2Image().saveAsJPEG('myCanvas', img.width, img.height))
                }, 300);
            };
            img.src = url;
        } catch (e) {
            alert(e.toString());
            reject(url);
        }
    })
}

//Canvas2Image.js下载地址	https://github.com/randreucetti/canvas2image/blob/master/canvas2image.js

注:
(1)Canvas的默认宽高为宽300px,高150px
(2)ctx.drawImage(img,x,y,width,height); //在画布上定位图像,并规定图像的宽度和高度

3、H5页面在iOS端部分数字颜色自动被改变成蓝色
原因:在ios端中,telephone=yes 默认开启把数字转化为拨号链接
解决方法:

//在index.html中
<head>
	//全局禁止把数字转化为拨号链接
	<meta name = "format-detection" content = "telephone=no">
</head>

如果某些页面需要用到这个功能:

//a标签内容变蓝
 <a :href="'tel:'+ data.attnPhone">联系电话:13xxxx</a>
 <p>联系电话:{{data.attnPhone}}
     <a class="mobile" :href="'tel:'+ data.attnPhone">
         <van-icon class="icon" name="mobile"></van-icon>
     </a>
 </p>

前端学习--Vue+H5开发APP踩坑_第1张图片
点击蓝色部分或者点击电话小图标就会弹出这个呼叫框
前端学习--Vue+H5开发APP踩坑_第2张图片
注:
(1)format-detection:格式检测,对应的content有telephone(电话)、email(邮箱)、adress(地图)

meta name=”format-detection” content=”telephone=no,email=no,adress=no”

4、滑动按钮执行函数

HTML:
	<div class="drag">
	    <div class="bg"></div>
	    <div class="text">滑动触发</div>
	    <div class="btn" 
	    v-on:touchstart="btnDown"
	    v-on:touchmove="btnMove"
	    v-on:touchend="btnEnd"> >> </div>
	</div>

JS:
	data(){
		return{
			 statclientX:0,//按钮最初的X轴位置                
	         distance:0,//滑动成功的宽度(距离)
	         offsetX:0 //实际滑动距离
		}
	}

	methods:{	
		btnDown(e){
			//记录按下的位置
	    	this.statclientX = e.touches[0].clientX;
	        let text = document.querySelector(".text");//文字
	        let btn = document.querySelector(".btn");//滑块	 
	        this.distance = parseInt(text.offsetWidth - btn.offsetWidth)+1;//滑动成功的宽度(距离)
	    },
	    btnMove(e){
	        let btn = document.querySelector(".btn");//滑块
	        let bg = document.querySelector(".bg");//背景
	        let offsetX = parseInt(e.touches[0].clientX - this.statclientX);
	        //在这里判断一下:鼠标水平移动的距离  滑动成功的距离 之间的关系
	        if( offsetX > this.distance){
	            offsetX = this.distance;//如果滑过了终点,就将它停留在终点位置
	            btn.style.left = offsetX + "px";
	            bg.style.width = offsetX+40 + "px";
	        }else if( offsetX < 0){
	            offsetX = 0;//如果滑到了起点的左侧,就将它重置为起点位置
	            btn.style.left = offsetX + "px";
	            bg.style.width = offsetX + "px";
	        }else{
	            btn.style.left = offsetX + "px";
	            bg.style.width = offsetX+20 + "px";
	        }
	        this.offsetX = offsetX;
	    },
	    btnEnd(e){
	        let btn = document.querySelector(".btn");//滑块
	        let bg = document.querySelector(".bg");//背景
	        let offsetX  = 0;
	        //在这里判断一下:鼠标水平移动的距离  滑动成功的距离 之间的关系
	        if( this.offsetX >= this.distance){
	            offsetX = this.distance;//如果滑过了终点,就将它停留在终点位置
	            btn.style.left = offsetX + "px";
	            bg.style.width = offsetX+40 + "px";
	        }else if( this.offsetX < 0){
	            offsetX = 0;//如果滑到了起点的左侧,就将它重置为起点位置
	            btn.style.left = offsetX + "px";
	            bg.style.width = offsetX + "px";
	        }  else{
	            btn.style.left = offsetX + "px";
	            bg.style.width = offsetX + "px";
	        }
	        this.offsetX = offsetX;
	        if(this.offsetX >= this.distance){
	        //滑动成功之后,执行相关函数
	           ...
	        }
	    },
	}

CSS:
  .drag{
    width: 80%;
    height: 80px;
    line-height: 80px;
    background-color: #0033aa;
    position: relative;
    margin:0 auto;
    border-radius: 50px;
    margin-top: 2px;
    margin-bottom: 2px;
  }
  .bg{
    height: 80px;
    line-height: 80px;
    position: absolute;
    background-color: #ff0000;
    border-radius: 50px;
  }
  .text{
    position: absolute;
    width: 100%;
    height: 100%;
    text-align: center;
    user-select: none;
    color: #fff;
    font-size: 28px;
  }
  .btn{
    width:80px;
    height: 80px;
    position: absolute;
    border:1px solid #ccc;
    cursor: move;
    font-family: "宋体";
    font-size: 30px;
    font-weight: bold;
    text-align: center;
    background-color: #fff;
    user-select: none;
    color:#666;
    border-radius: 50px;
  }

在这里插入图片描述在这里插入图片描述

5、不同浏览器对H5的兼容不一样,因此页面展示也不一样

6、最新版的Chrome浏览器(以及所有以Chromium为内核的浏览器)中,已不再允许自动播放音频和视频

7、onclick 有300毫秒的延迟;移动端的触发事件 可以用touchstart

8、使用Xammp软件可以在将webstrom上的改动直接显示到手机上进行调试
实现步骤:
(1)打开win+R,输入cmd,在cmd中输入ipconfig /all 查看本地ip
(2)在config/index.js中输入查看到的ip地址
(3)重新启动dev
前端学习--Vue+H5开发APP踩坑_第3张图片在这里插入图片描述
(4)设置一个入口,在项目的某个页面里写一个输入框,输入关键字进入调试

 <van-search
        :placeholder="'请输入' + placeholder"
         v-model="value"         
         @search="onSearch(value)"        
 >      
 </van-search>

data(){
	return{
		value:''
	}
},
methods:{
	onSearch(value){		 
         //前端本地调试
         if (value == 'app-bugabc.12345') {
             window.location.href = 'http://192.168.xxx.xxx:8080/#/';
             return false
         }
	}
}

9、利用正则匹配中文并返回匹配到的内容

 let pattern1 = /[\u4e00-\u9fa5]+/g;
 let contents = '123这里是中文';
 let content = contents.match(pattern1); //输出'这里是中文'

10、iPhoneX 展示列表时,信息内容穿过底部导航栏问题
前端学习--Vue+H5开发APP踩坑_第4张图片
解决方法:
在页面上多增加一个div,将div固定在bottom:-44px的地方(因为iPhoneX的底部安全区域大概为44px)

 <div class="blank"></div>
 
 css:
  .blank{
    position: fixed;
    bottom: -88px;
    width: 100%;
    height: 88px;
    background: #fff;
  }

11、H5页面中有表单输入框时,尽可能不要去使用定位去显示按钮。这个在ios端会导致键盘弹出再隐藏之后,输入框的点击位置改变

12、app打包时加入随机数清除页面缓存
前端学习--Vue+H5开发APP踩坑_第5张图片
13、css 文本超出2行就隐藏并且显示省略号

overflow:hidden; 
text-overflow:ellipsis; 
display:-webkit-box; 
-webkit-box-orient:vertical; 
-webkit-line-clamp:2; //表示显示的行数。

14、利用script加载一个js文件

 <script>
        document.write(
            '
                    
                    

你可能感兴趣的:(前端学习--Vue+H5开发APP踩坑)