分別使用vue和Android實(shí)現(xiàn)長按券碼復(fù)制功能
最近分別用vue和Android實(shí)現(xiàn)了一個(gè)券碼復(fù)制功能,長按券碼會(huì)在上方彈出一個(gè)拷貝的icon提示,點(diǎn)擊icon將券碼內(nèi)容復(fù)制到剪貼板?,F(xiàn)將一些經(jīng)驗(yàn)代碼分享給大家以供參考。廢話不多說,先上效果圖

vue實(shí)現(xiàn):
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;
// 對(duì)x,y的計(jì)算結(jié)果進(jìn)行微調(diào)
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 => {
// 釋放內(nèi)存
clipboard.off('error');
clipboard.off('success');
clipboard.destroy();
});
clipboard.on('error', e => {
// 釋放內(nèi)存
clipboard.off('error');
clipboard.off('success');
clipboard.destroy();
});
clipboard.onClick(e);
}
}
實(shí)現(xiàn)原理是將氣泡彈窗設(shè)置為絕對(duì)定位,根據(jù)券碼的位置來計(jì)算氣泡彈窗相對(duì)于父元素的位置,其中父元素為每一條item的包裹元素coupon-code-item
本次的實(shí)現(xiàn)難點(diǎn)是需要自己手動(dòng)定義vue的長按點(diǎn)擊事件:
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();//獲取焦點(diǎn)
if(!propagation){
if (e.stopImmediatePropagation) {
e.stopImmediatePropagation();
} else {
e.propagationStopped = true;
}
e.stopPropagation();
return false;
}
}
},false);
}
})
Android實(shí)現(xiàn):
Android原生實(shí)現(xiàn)起來比較簡單,直接貼代碼

以上兩種實(shí)現(xiàn)方法全部完成,為了簡單直接讓UI切了一張氣泡彈窗的顯示圖,如果感興趣也可以用代碼手動(dòng)繪制
總結(jié)
以上所述是小編給大家介紹的分別使用vue和Android實(shí)現(xiàn)長按券碼復(fù)制功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
java asp分析各種搜索引擎的關(guān)鍵字,自動(dòng)識(shí)別url 中關(guān)鍵字的編碼
網(wǎng)上也有一些代碼,大部分都是通過輸入的關(guān)鍵字來識(shí)別編碼,并解碼。但是搜索引擎得到的referer來源地址上的關(guān)鍵字是通過URLencode編碼過的,而且各個(gè)網(wǎng)站的關(guān)鍵字Urlencode編碼都不一樣,gbk,utf-8,gb2312等等。2009-01-01
聯(lián)邦學(xué)習(xí)論文解讀分散數(shù)據(jù)的深層網(wǎng)絡(luò)通信
這篇文章主要為大家介紹了論文解讀分散數(shù)據(jù)的深層網(wǎng)絡(luò)通信有效學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Jebrains付費(fèi)插件Activation code[持續(xù)更新]
這篇文章主要介紹了Jebrains付費(fèi)插件Activation code[持續(xù)更新],使用本Activation code需要jetbrains-agent支持!感興趣的朋友跟隨小編一起看看吧2020-09-09
Web前端和JAVA應(yīng)該學(xué)哪個(gè)?哪個(gè)就業(yè)形勢(shì)更勝一籌?
這篇文章主要介紹了Web前端和JAVA應(yīng)該學(xué)哪個(gè)?哪個(gè)就業(yè)形勢(shì)更好?本文通過幾個(gè)城市的薪資收入對(duì)比分析,需要的朋友可以參考下2020-07-07
字符編碼詳解及由來(UNICODE,UTF-8,GBK) 比較詳細(xì)
很久很久以前,有一群人,他們決定用8個(gè)可以開合的晶體管來組合成不同的狀態(tài),以表示世界上的萬物。他們看到8個(gè)開關(guān)狀態(tài)是好的,于是他們把這稱為字節(jié)2012-04-04
微信支付、支付寶支付等常用第三方支付通道接口手續(xù)費(fèi)對(duì)比
微信支付、支付寶等第三方支付,需要和銀聯(lián)、網(wǎng)聯(lián)對(duì)接,有清算機(jī)構(gòu)和銀行的交易處理通道成本。費(fèi)率指支付手續(xù)費(fèi)的費(fèi)率,不同行業(yè)、不同的支付平臺(tái)、不同的支付額度或次數(shù)所對(duì)應(yīng)的通道費(fèi)率是不一樣的。2023-01-01

