復(fù)制文本到剪切板的方法(個(gè)人筆記)

一何恶、navigator.clipboard.writeText()方法

注:該方法需要在安全域下才能夠使用细层,比如:https 協(xié)議的地址、127.0.0.1盛撑、localhost

<template>
  <div>
    <el-button type="primary" @click="handleCopy">復(fù)制</el-button>
    <div>{{ message }}</div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      message: "復(fù)制的內(nèi)容",
    };
  },

  methods: {
    handleCopy() {
      navigator.clipboard
        .writeText(this.message)
        .then(() => {
          this.$message.success("復(fù)制成功");
        })
        .catch((err) => {
          // 復(fù)制失敗
          console.error("復(fù)制失敗");
        });
    },
  },
};
</script>

二捧搞、clipboard.js的使用

原文鏈接:https://segmentfault.com/a/1190000020651289?utm_source=tag-newest

安裝

npm 安裝

npm install clipboard --save

或者,如果您不喜歡包管理介粘,只需下載一個(gè)ZIP文件

設(shè)置

現(xiàn)在需要通過傳遞一個(gè)DOM選擇器创坞、一個(gè)HTML標(biāo)簽或者一組HTML標(biāo)簽來實(shí)例化它

new ClipboardJS('.btn');  //通過類名.btn的元素實(shí)例化

在內(nèi)部,我們需要獲取與選擇器匹配的所有元素偎谁,并為每個(gè)元素附加事件監(jiān)聽器纲堵。但你猜怎么著?如果有數(shù)百個(gè)匹配項(xiàng),則此操作會(huì)消耗大量內(nèi)存铐望。
因此茂附,我們使用事件委托,它將多個(gè)事件偵聽器替換為一個(gè)偵聽器营曼。

報(bào)錯(cuò)

如出現(xiàn)innerHtml的報(bào)錯(cuò)蒂阱,就把實(shí)例化寫到定時(shí)器里面狂塘。

setTimeout(()=>{
    new Clipboard(document.getElementById('copyBtn'));
},1000)

使用方法

我們正在經(jīng)歷一個(gè)聲明性的復(fù)興鳄厌,這就是為什么我們決定利用HTML5的數(shù)據(jù)屬性來獲得更好的可用性

復(fù)制

相當(dāng)普遍的使用場景是從其他元素復(fù)制文本。在觸發(fā)元素上添加 data-clipboard-target 屬性泪漂,該屬性值用來匹配另一個(gè)元素選擇器新思。

<!-- Target -->
<!-- <input
  id="bar"
  value="無敵大帥哥"
> -->
<p id="bar">無敵大帥哥</p>
<!-- Trigger -->
<button class="btn" data-clipboard-target="#bar" > 復(fù)制 </button>

剪切

另外,也可以定義 data-clipboard-action 屬性為 copy/cut 來纵刘,明確操作是 復(fù)制 / 剪切
如果忽略了這個(gè)屬性荸哟,便默認(rèn) 復(fù)制

<!-- Target -->
<textarea id="bar">Mussum ipsum cacilds...</textarea>

<!-- Trigger -->
<button class="btn" data-clipboard-action="cut" data-clipboard-target="#bar">
    Cut to clipboard
</button>

正如上例,剪切 cut 的操作只能在 <input><textarea> 標(biāo)簽中起作用舵抹,在其他標(biāo)簽中會(huì)出現(xiàn)事件正常調(diào)用劣砍,但是操作是失敗的,粘貼板是沒有改變的刑枝。

通過屬性復(fù)制文本

我們甚至不必需要其他承載文本的元素装畅,僅通過 在觸發(fā)元素中 添加 data-clipboard-text 屬性 來完成復(fù)制

<!-- Trigger -->
<button class="btn" data-clipboard-text="Just because you can doesn't mean you should — clipboard.js">
    Copy to clipboard
</button>

注意:

  • data-clipboard-text “級別最高”,在 data-clipboard-target 等屬性存在時(shí)掠兄,復(fù)制內(nèi)容及相關(guān)參數(shù)以 data-clipboard-text 為準(zhǔn)

事件

回調(diào)函數(shù): success / error

事件名 參數(shù)
success event.action copy/cut 操作
event.text copy/cut 操作文本內(nèi)容
event.triger 觸發(fā)操作的DOM元素
error event.action copy/cut 操作
event.triger 觸發(fā)操作的DOM元素
var clipboard = new ClipboardJS('.btn');

clipboard.on('success', function(e) {
    console.info('Action:', e.action);
    console.info('Text:', e.text);
    console.info('Trigger:', e.trigger);

    e.clearSelection();
});

clipboard.on('error', function(e) {
    console.error('Action:', e.action);
    console.error('Trigger:', e.trigger);
});

工具提示

每個(gè)應(yīng)用程序有不同的設(shè)計(jì)需求蚂夕,這就是為什么clipboard.js不包括任何CSS或內(nèi)置的工具提示解決方案。
您在這個(gè)演示站點(diǎn)上看到的工具提示是使用GitHub的Primer構(gòu)建的侈贷。如果你正在尋找相似的外觀和感覺牍汹,你可能想看看。

高級用法

如果你不想修改你的HTML嫁蛇,有一個(gè)非常方便的命令式API供你使用露该。您所需要做的就是聲明一個(gè)函數(shù),執(zhí)行您的操作解幼,然后返回一個(gè)值。

例如 如果想動(dòng)態(tài)的設(shè)置一個(gè)目標(biāo)元素target底靠,則需要返回一個(gè)節(jié)點(diǎn),即 動(dòng)態(tài)設(shè)置點(diǎn)擊復(fù)制的目標(biāo)元素

new ClipboardJS('.btn', {
    target: function(trigger) {
        return trigger.nextElementSibling  ||  document.getElementById('name');
    }
});

如果想動(dòng)態(tài)設(shè)置內(nèi)容文本text特铝,則返回一個(gè)字符串String

new ClipboardJS('.btn', {
    text: function(trigger) {
        return trigger.getAttribute('aria-label') || 'default text ';
    }
});

Bootstrap Modals 中或與任何其他更改焦點(diǎn)的庫一起使用時(shí)鲫剿,將希望將焦點(diǎn)元素設(shè)置為 container 值。

new ClipboardJS('.btn', {
    container: document.getElementById('modal')
});

并且灵莲,如果在單頁應(yīng)用中使用時(shí),要更精確地管理DOM的生命周期枚抵,可以使用以下方法清除創(chuàng)建的事件對象

var clipboard = new ClipboardJS('.btn');
clipboard.destroy();

動(dòng)態(tài)生成多個(gè)實(shí)例

<el-table-column align="center" prop="push_flow" label="推流地址">
     <template scope="{row}">
          <span>{{row.push_flow}}</span>
          <el-button 
              type="text"
              size="small" 
              class="" 
              :id="'streamurl'+row.live_id" 
              :data-clipboard-text="row.push_flow" 
              @click="handleFlowCopy(row.live_id)">
              復(fù)制
           </el-button>
      </template>
</el-table-column>
handleFlowCopy(id) {
    // 根據(jù)當(dāng)前id動(dòng)態(tài)生成不同實(shí)例
    var streamurl = new Clipboard(document.getElementById('streamurl' + id));
    streamurl.on('success', (e) => {
        this.$message.success('復(fù)制成功')
        streamurl.destroy()
    });
},

以上方法當(dāng)點(diǎn)擊按鈕時(shí)才實(shí)例化俄精,所以第一次點(diǎn)擊復(fù)制不成功榕堰,第二次后面才成功。處理方法:當(dāng)請求table數(shù)據(jù)成功后就實(shí)例化一次逆屡。

handleGetTableData() {
     getData().then(res => {
          res.data.map(i => {
               new Clipboard(document.getElementById('streamurl' + i.live_id));
          })
     })
}

瀏覽器支持

這個(gè)庫同時(shí)依賴于SelectionexecCommand api魏蔗。所有瀏覽器都支持第一個(gè),而以下瀏覽器支持第二個(gè)莺治。

  • Chrome 42 +
  • Edge12 +
  • Firefox 41 +
  • IE 9 +
  • Opera 29 +
  • Safari 10 +

好消息是,如果需要支持舊的瀏覽器床佳,clipboard.js可以優(yōu)雅地降級。你所要做的就是顯示一個(gè)工具提示“復(fù)制!”在調(diào)用成功事件時(shí)杆麸,因?yàn)槲谋疽呀?jīng)被選中浪感,所以在調(diào)用錯(cuò)誤事件時(shí),請按Ctrl+C進(jìn)行復(fù)制影兽。
你也可以通過運(yùn)行ClipboardJS.isSupported()來檢查是否支持clipboard.js赢笨,這樣你就可以從UI中隱藏復(fù)制/剪切按鈕

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萧吠,一起剝皮案震驚了整個(gè)濱河市桐筏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梅忌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琼腔,死亡現(xiàn)場離奇詭異踱葛,居然都是意外死亡尸诽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門洲赵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人叠萍,你說我怎么就攤上這事『蟮拢” “怎么了抄腔?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵理张,是天一觀的道長。 經(jīng)常有香客問我悟耘,道長织狐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任旺嬉,我火速辦了婚禮厨埋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雨效。我一直安慰自己废赞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布据悔。 她就那樣靜靜地躺著渣蜗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕拷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天浸赫,我揣著相機(jī)與錄音,去河邊找鬼羡榴。 笑死运敢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的迄沫。 我是一名探鬼主播卦方,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尘吗!你這毒婦竟也來了浇坐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤侧戴,失蹤者是張志新(化名)和其女友劉穎跌宛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疆拘,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哎迄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翔烁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旨涝。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慨默,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厦取,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布铡买,位于F島的核電站霎箍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缀壤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一塘慕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧图呢,春花似錦、人聲如沸赴叹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绽媒。三九已至免猾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猎提,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工石窑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躺屁。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓经宏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親烁兰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348