JavaScript實現(xiàn)復制粘貼

有個很常見的生活場景是:我們在網(wǎng)頁上閱讀一篇文章耗跛,移動鼠標,框選一段文字攒发,這個時候文字有了藍色背景调塌,點鼠標右鍵,選擇復制惠猿,就可以把選中的文字復制到剪貼板中羔砾。 其實這一小小的行為在 JavaScript 中涉及到如下一些術(shù)語:

相關(guān)術(shù)語

  • 錨點(anchor)

錨點指的是一個選區(qū)的起始點,這里的錨點不同于HTML中的錨點鏈接。當我們使用鼠標框選一個區(qū)域的時候蜒茄,錨點就是我們鼠標按下瞬間的那個點。在用戶拖動鼠標時餐屎,錨點是不會變的檀葛。

  • 焦點(focus)

選區(qū)的焦點是該選區(qū)的終點,當您用鼠標框選一個選區(qū)的時候腹缩,焦點是你的鼠標松開瞬間所記錄的那個點屿聋。隨著用戶拖動鼠標,焦點的位置會隨著改變藏鹊。

  • 范圍(range)

范圍俗稱拖藍润讥,用來表示用戶選中的文本區(qū)域,即從錨點到焦點的這一段文本區(qū)域盘寡。

HTMLInputElement 的三種方法

  • 選中文本域中的內(nèi)容

HTMLInputElement.select() 

英文解釋為:Selects the input text in the element, and focuses it so the user can subsequently replace the whole entry.
剛認識這個方法的時候楚殿,下意識的覺得應該會返回選中的文字才對,然而并沒有竿痰,這個方法沒有返回值脆粥,僅僅只是選中了文字而已。

  • 在文本域上設(shè)置焦點

HTMLInputElement.focus() 

英文解釋為:Focus on input; keystrokes will subsequently go to this element.

  • 從文本域上移開焦點

HTMLInputElement.blur() 

英文解釋為:Removes focus from input; keystrokes will subsequently go nowhere.

值得注意的是以上三種方法都只面向 <input> 和 <textarea> 結(jié)點影涉,并且都沒有返回值变隔。

document.execCommand

文檔對象的 execCommand方法允許運行命令來操縱可編輯區(qū)域的內(nèi)容,具體可以查看這里. 下面僅介紹 copy 這個方法:

bool = document.execCommand(copy)

這個方法指拷貝當前選中內(nèi)容到剪貼板蟹倾,返回值為一個 bool 值匣缘, 如果返回值為 false 則表示操作不被支持或未被啟用。
很遺憾的是這個方法的瀏覽器兼容性一般鲜棠,IE 僅支持 8 以上的版本肌厨。

通過以上幾個方法我們已經(jīng)可以實現(xiàn)簡單的復制粘貼功能了:

  <input type="text" class="box-text" value="choose me!" />
  <button class="bt-copy" >copy</button>

  <script>
    $('.bt-copy').click(function(){
      var copyTarget = $('.box-text');
      copyTarget.select();
      try {
        document.execCommand('copy');
      }
      catch (err) {
        alert('請使用CTRL+C,CTRL+V來復制粘貼~');
      }
      copyTarget.blur();
    })  
  </script>

短短幾行代碼就實現(xiàn)了復制粘貼的功能,但仍然有改進的地方:

  • 增加除 <input> 和 <textarea> 外的結(jié)點的支持岔留,可以借鑒 select.js 的實現(xiàn)方法夏哭。
  • 對不支持 document.execCommand('copy') 的瀏覽器使用 ZeroClipboard 作為 fallback。

---------------------------------------- 2017/5/5日 更 ----------------------------------------

之前說過献联, .select() 方法僅支持 <input><textarea> 元素竖配,發(fā)現(xiàn)一個更好的辦法用于解決這個問題:

  • 用 js 生成一個隱藏的 <textarea> 元素,追加到 dom 里面里逆。
  • 把需要復制的文本賦值給剛生成的 <textarea> 元素进胯。
  • 使用原生的方法進行選中和復制的操作。
  • 最后記得在DOM中移除 <textarea> 元素原押。
var textArea = document.createElement('textarea');
textArea.style.position = 'fixed';
textArea.style.left = '-10000px';
textArea.style.top = '-10000px';
document.body.appendChild(textArea);
textArea.value = this.copyText;
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胁镐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盯漂,老刑警劉巖颇玷,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異就缆,居然都是意外死亡帖渠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門竭宰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來空郊,“玉大人,你說我怎么就攤上這事切揭∧酰” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵廓旬,是天一觀的道長哼审。 經(jīng)常有香客問我,道長嗤谚,這世上最難降的妖魔是什么棺蛛? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮巩步,結(jié)果婚禮上旁赊,老公的妹妹穿的比我還像新娘。我一直安慰自己椅野,他們只是感情好终畅,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著竟闪,像睡著了一般离福。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炼蛤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天妖爷,我揣著相機與錄音,去河邊找鬼理朋。 笑死絮识,一個胖子當著我的面吹牛槽畔,可吹牛的內(nèi)容都是我干的邑飒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼姚淆,長吁一口氣:“原來是場噩夢啊……” “哼兽愤!你這毒婦竟也來了彼念?” 一聲冷哼從身側(cè)響起挪圾,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逐沙,沒想到半個月后哲思,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡吩案,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年也殖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片务热。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖己儒,靈堂內(nèi)的尸體忽然破棺而出崎岂,到底是詐尸還是另有隱情,我是刑警寧澤闪湾,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布冲甘,位于F島的核電站,受9級特大地震影響途样,放射性物質(zhì)發(fā)生泄漏江醇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一何暇、第九天 我趴在偏房一處隱蔽的房頂上張望陶夜。 院中可真熱鬧,春花似錦裆站、人聲如沸条辟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羽嫡。三九已至,卻和暖如春肩袍,著一層夾襖步出監(jiān)牢的瞬間杭棵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工氛赐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魂爪,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓鹰祸,卻偏偏與公主長得像甫窟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛙婴,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容