当前位置: 首页 > Web前端 > vue.js

vue2.x移动端长按事件实现方法

时间:2023-03-31 21:35:55 vue.js

vue总结移动端长按事件实现的几种方法城狮,我想告诉你一个严重的问题。这几天心情一直很低落,代码都搬不动了。结果今天到公司开禅道,大家可能还不知道禅道是什么。在虫子的地方,一大早就来了三只虫子,顿时一万只草泥马从我头上飘过:结果我还是害怕,大家看看是什么虫子?看了槽,原来是兼容性问题,知道吗?做前端最怕什么?就是尼玛的兼容性,尤其是有一个顽固的浏览器,IE,这个被砍成碎片的家伙,害了多少代程序员,哈哈,还好我们只需要兼容移动端就行了,还有PC端网站需要兼容ipad端。接下来的问题是什么?原来pc端不能出现右键菜单。看到没有兼容移动端的事件,因为在pc端我们只需要使用@contextmenu事件就可以实现右键菜单。当然我们需要先实现一个菜单组件,我们的菜单可能需要兼容二级菜单,所以我们需要实现二级菜单:``这里面有个逻辑,当你点击右键的时候,会出现右键菜单,所以需要一个控件右键菜单menuShow,当然我们还需要知道菜单名称是什么,所以我们需要一个数组来控制clickMenus:``我们应该像这样使用外部组件:`ExportDefault{data(){return{clickmenus:[{fnName:Fnamegroup',Text:},},,,text,},,,},,},,},},,},},,},,},},,},,,},,},,},,},,},},,},,},},,},,},,},},,,},},,,},},,},,,},},,,},,},,},},,},,},},,,},},},,,},}'Combinegroup',text:this.ufd.text['text.plan.combine.group'],},{fnname:'delete',text:this.ufd.text['text.del'],},],showMenu:false,//显示菜单标识}},methods:{clickEvent(name){}}}`接下来我们需要了解移动端事件,因为移动端不像pc端那样有鼠标事件,只有移动端Touch事件:我们今天处理bug最简单的方法就是使用@touchstart,@touchend:`//实现对-长按移动端开始后点击菜单(e,group,nodeIndex,dayIndex,dayPriceSort,groupIndex){clearTimeout(this.loop)//再次清空定时器,防止重复注册定时器让that=thisthis.loop=setTimeout(()=>{that.ipadMenucontext(e,group,nodeIndex,dayIndex,dayPriceSort,groupIndex)},1000)},end(e){e.preventDefault()clearTimeout(this.loop)//清除定时器,防止重复注册定时器},`我们在delay函数中可以看到执行右键时需要处理的动作。当我们的手指开始触摸时,我们需要使用clearTimeout来清除上一次的Timer,然后执行我们要执行的动作。触摸结束后,我们需要清除定时器。那么这个处理完成之后,我们在ipad上就可以看到,当我们用手指按住ipad屏幕的时候,就会出现右键菜单上面是移动端长按实现的右键菜单。接下来总结一下Vue中的长按事件是没有封装的,我们在使用的时候需要自己写一个获取长按事件的方法。方法一:使用@touchstart,@touchen`start(){clearTimeout(this.loop);//再次清除定时器,防止重复注册定时器this.loop=setTimeout(()=>{console.log("longPressed");},1000);},end(){clearTimeout(this.loop);//清除定时器,防止重复注册定时器},`备注注意:使用时,如果是图片建议使用设置图片为背景,直接使用图片,长按会触发浏览器保存和分享图片。方法二:指令``exportdefault{install(Vue,options={time:2000,}){Vue.directive('longpress',{bind:function(el,binding,vNode){if(typeofbinding.value!=='function'){constcompName=vNode.context.nameletwarn=[longpress:]providedexpression'${binding.expression}'不是函数,但必须是if(compound)Fin{warn+=component'${compName}'}console.warn(warn)}//定义变量letpressTimer=null//定义函数处理程序//创建定时器(1秒后执行函数)>e(let=start){if(iF(e.type==='click'&&e.button!==0){return}if(mstimer===null){presstimer=settimeout(()=>{//executefunctionhandler()},options.time)}}}}//取消定时器letcancel=(e)=>{//检查定时器是否有值if(pressTimer!==null){cLeartimeout(Presstimer)Presstimer=NULL}//运行函数constHandler=(E)=>{//执行指令的方法binding.value(e)}//添加事件监视器el.addeventris('mouseDown',start)el.addEventListener('touchstart',start)//取消定时器el.addEventListener('click',cancel)el.addEventListener('mouseout',cancel)anceel.addel.couchend',addEventListener('touchcancel',取消)},})},}``