分别使用vue和Android实现长按券码复制功能

作者:Sherry慈 时间:2023-10-29 23:20:11 

最近分别用vue和Android实现了一个券码复制功能,长按券码会在上方弹出一个拷贝的icon提示,点击icon将券码内容复制到剪贴板。现将一些经验代码分享给大家以供参考。废话不多说,先上效果图

分别使用vue和Android实现长按券码复制功能

vue实现:

npm install clipboard --save


<div class="coupon-count-container" @click="closePopBubble">
<ul>
 <li v-for="(couponItem, index) in couponArray" :key="index">
  <div class="coupon-code-item">
   <img class="pop-bubble-copy" :style="{left: x + 'px', top: y + 'px', visibility: showPopBubble && index === clickedIndex ? 'visible' : 'hidden'}" src="../../assets/couponPayResult/copy_icon.png" @click="copyToClipboard($event, couponArray[clickedIndex].codeNo)">
   <span class="code-label">券码:</span><span class="code-active" v-tap="{longMethod: getPopBubble, params: index}">{{couponItem.codeNo}}</span>
  </div>
 </li>
</ul>
</div>

data: function() {
return {
 couponArray: [],
 showPopBubble: false,
 x: 0,
 y: 0,
 clickedIndex: 0
}
}

.coupon-code-item {
position: relative;
padding: 10px 0;
font-size: 13px;
}

.pop-bubble-copy {
position: absolute;
width: 73px;
height: 39px;
}

.code-label {
margin-left: 28px;
margin-right: 26px;
color: #989898;
}

.code-active {
color: $color-ff5532;
}

methods: {
closePopBubble() {
 if (this.showPopBubble) {
  this.showPopBubble = false;
 }
},
getPopBubble(e, index) {
 this.showPopBubble = true;
 this.clickedIndex = index;
 // 对x,y的计算结果进行微调
 this.x = e.target.offsetLeft + 30;
 this.y = e.target.offsetTop - 40;
},
copyToClipboard(e, text) {
 this.showPopBubble = false;
 var clipboard = new Clipboard(e.target, {text: () => text.replace(/\s/g, "")});
 clipboard.on('success', e => {
  // 释放内存
  clipboard.off('error');
  clipboard.off('success');
  clipboard.destroy();
 });
 clipboard.on('error', e => {
  // 释放内存
  clipboard.off('error');
  clipboard.off('success');
  clipboard.destroy();
 });
 clipboard.onClick(e);
}
}

实现原理是将气泡弹窗设置为绝对定位,根据券码的位置来计算气泡弹窗相对于父元素的位置,其中父元素为每一条item的包裹元素coupon-code-item

本次的实现难点是需要自己手动定义vue的长按点击事件:


Vue.directive('tap',{
bind:function(el,binding){
 var startTx, startTy,endTx,endTy,longClick,timeOutEvent,
 longMethod=binding.value.longMethod,
 method = binding.value.method,
 params = binding.value.params,
 propagation=binding.value.propagation;
 el.addEventListener("touchstart",function(e){
  var touch=e.touches[0];
  startTx = touch.clientX;
  startTy = touch.clientY;
  if(longMethod && typeof longMethod==='function'){
   longClick=0;
   timeOutEvent =setTimeout(function(){
   longClick=1;
   longMethod(e, params);
   },500)
  }
  if(!propagation){
   if (e.stopImmediatePropagation) {
   e.stopImmediatePropagation();
   } else {
    e.propagationStopped = true;
   }
  }
 },false );
 el.addEventListener("touchmove",function(e){
  if(longMethod && timeOutEvent){
  clearTimeout(timeOutEvent);
  timeOutEvent = 0;
  }
 },false);
 el.addEventListener("touchend",function(e){
  var touch = e.changedTouches[0];
  endTx = touch.clientX;
  endTy = touch.clientY;
  if(longMethod && timeOutEvent){
   clearTimeout(timeOutEvent);
  }
  if((timeOutEvent!=0 && longClick==0)||!longMethod){
   if( Math.abs(startTx - endTx) < 6 && Math.abs(startTy - endTy) < 6){
   if(params instanceof Array){
    method(...params);
   }
   else method(params);
   }
   var focusInput=document.querySelector('input:focus');
   if(focusInput)focusInput.blur();
   var tagName=el.tagName.toLowerCase();
   if(tagName==='input'||tagName==='textarea')el.focus();//获取焦点
   if(!propagation){
   if (e.stopImmediatePropagation) {
    e.stopImmediatePropagation();
   } else {
    e.propagationStopped = true;
   }
   e.stopPropagation();
   return false;
   }
  }
 },false);
}
})

Android实现:

Android原生实现起来比较简单,直接贴代码

分别使用vue和Android实现长按券码复制功能

以上两种实现方法全部完成,为了简单直接让UI切了一张气泡弹窗的显示图,如果感兴趣也可以用代码手动绘制

总结

以上所述是小编给大家介绍的分别使用vue和Android实现长按券码复制功能,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://blog.csdn.net/weixin_41480546/article/details/102516948

标签:vue,android,长按,劵码,复制
0
投稿

猜你喜欢

  • 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别

    2023-11-20 14:14:52
  • 详解Python中的各种函数的使用

    2022-03-23 22:09:52
  • python入门语句基础之if语句、while语句

    2023-08-14 01:22:55
  • pytorch实现手写数字图片识别

    2021-04-20 12:46:58
  • Python基础学习函数+模块+类

    2023-10-26 01:37:42
  • 自然选择:自然界的颜色与界面设计[译]

    2009-09-19 17:17:00
  • asp显示字符串前5个文字

    2008-08-10 18:47:00
  • 基于Python实现自动化生成数据报表

    2021-11-07 00:42:16
  • python中查看变量内存地址的方法

    2023-11-06 01:38:21
  • Zabbix实现监控多个mysql过程解析

    2024-01-25 20:24:53
  • 浅谈Python函数式编程的返回函数与匿名函数

    2021-02-22 13:40:36
  • 使用python遍历指定城市的一周气温

    2022-01-01 18:25:26
  • python flask之模板继承方式

    2022-05-26 03:38:24
  • python 实现人和电脑猜拳的示例代码

    2021-04-11 01:42:14
  • 在python中利用GDAL对tif文件进行读写的方法

    2022-03-25 08:08:07
  • c#连接sqlserver数据库、插入数据、从数据库获取时间示例

    2024-01-16 02:13:53
  • 创意方法杂谈

    2009-05-13 12:53:00
  • 使用Go进行单元测试的实现

    2024-04-25 15:11:07
  • SQLSERVER 中datetime 和 smalldatetime类型分析说明

    2024-01-23 23:36:13
  • pytorch 数据处理:定义自己的数据集合实例

    2021-09-11 06:10:21
  • asp之家 网络编程 m.aspxhome.com