記:通過(guò)js完成復(fù)制(h5)

有這樣一個(gè)需求,用戶(hù)點(diǎn)擊或其它(例如雙擊事件)操作后,需要復(fù)制一段文字,實(shí)現(xiàn)有三種方式。

1.input 復(fù)制

基本的復(fù)制過(guò)程:
選中(select)
復(fù)制(command + c || ctrl + c)
類(lèi)似于下圖


復(fù)制

最常見(jiàn)的做法就是動(dòng)態(tài)創(chuàng)建 input 元素,然后動(dòng)態(tài)制定 input[value]。執(zhí)行 select(), 進(jìn)行選中,然后執(zhí)行 copy 即可。

 總的代碼就是
function copyContent(elementId) {

  // 動(dòng)態(tài)創(chuàng)建 input 元素
  var aux = document.createElement("input");

  // 獲得需要復(fù)制的內(nèi)容
  aux.setAttribute("value", document.getElementById(elementId).innerHTML);

  // 添加到 DOM 元素中
  document.body.appendChild(aux);

  // 執(zhí)行選中
  // 注意: 只有 input 和 textarea 可以執(zhí)行 select() 方法.
  aux.select();

  // 獲得選中的內(nèi)容
    var content = window.getSelection().toString();

  // 執(zhí)行復(fù)制命令
  document.execCommand("copy");

  // 將 input 元素移除
  document.body.removeChild(aux);

}

2.任意復(fù)制

如果你想不動(dòng)態(tài)添加 input 元素,想直接 copy 的指定 DOM 元素的話,應(yīng)該怎么做呢?這里就需要使用到 HTML5 新提供的 createRange() 相關(guān)方法。當(dāng)然,上面的 getSelection() 也是其中之一。用到的 API 有:

  • document.createRange(): 用來(lái)創(chuàng)建選中容器。返回一個(gè) range Object。
  • selectNode(DOM): 返回 range Object 上掛載的方法。用來(lái)添加選中元素。只能添加一個(gè)
  • window.getSelection()
  • addRange(range): 這個(gè)方法是掛載到 getSelection() 方法下的,用來(lái)執(zhí)行元素的選中。(!很重要)
   var copyDOM = document.querySelector('#selector');  
  var range = document.createRange();  
  // 選中需要復(fù)制的節(jié)點(diǎn)
  range.selectNode(copyDOM);
  // 執(zhí)行選中元素
  window.getSelection().addRange(range);
  // 執(zhí)行 copy 操作
var successful = document.execCommand('copy');  
  try {  
    var msg = successful ? 'successful' : 'unsuccessful';  
    console.log('copy is' + msg);  
  } catch(err) {  
    console.log('Oops, unable to copy');  
  }
// 移除選中的元素
  window.getSelection().removeAllRanges();

注:該方式被復(fù)制的節(jié)點(diǎn)一定是可見(jiàn)的。

3.使用 clipboard 實(shí)現(xiàn)自定義復(fù)制內(nèi)容

clipboardData: 該 obj 還掛載兩個(gè)常用的 API

  • setData(format, data): 設(shè)置相關(guān)的數(shù)據(jù)信息,主要用于 copycut 的相關(guān)事件中。
  • format: 就是基本的 MIME type。最常用的就是 text/plain。具體內(nèi)容可以參考 MIME references
  • data: 就是對(duì)應(yīng) MIME type 放入的具體數(shù)據(jù)內(nèi)容
  • getData(format): 一般用于 paste 事件中。用來(lái)獲取 clipboard 里面的內(nèi)容。不過(guò),需要制定正確的解碼格式(就是設(shè)置好正確的 MIME type)。并且,該方法只能在 paste 事件中使用。
// 在指定 DOM 上綁定交互事件
DOM.addEventListener('click',function(){},false){
    // 添加 copy 內(nèi)容
    document.addEventListener('copy',function copy (e) {
            e.clipboardData.setData('text/plain', "copy text");
            e.preventDefault();
        })
    // 執(zhí)行 copy 命令
    document.execCommand('copy');
    // 移除綁定事件
    document.removeEventListener('copy','copy');
}

原文鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • VBA訂制工具欄 http://club.excelhome.net/thread-1047254-1-1.htm...
    大海一滴寫(xiě)字的地方閱讀 2,351評(píng)論 0 0
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁(yè)的形式展示給用戶(hù)的,因此網(wǎng)頁(yè)是網(wǎng)絡(luò)信息傳遞的載體。網(wǎng)頁(yè)文件是用...
    阿啊阿吖丁閱讀 4,909評(píng)論 0 0
  • http://python.jobbole.com/85231/ 關(guān)于專(zhuān)業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,787評(píng)論 1 118
  • 大家好!我叫鄭雪玲,我來(lái)自福建南端的一個(gè)小島——東山島(有著“福建小三亞”之稱(chēng)),所以同學(xué)都叫直呼我“島主”,為...
    島主nice1閱讀 455評(píng)論 0 0

友情鏈接更多精彩內(nèi)容