2015-10-19 72 views
10

當前代碼附加一個按鈕以快速選擇<pre>標記中的某些代碼。我想添加的是將該內容複製到剪貼板並將按鈕文本更改爲「複製」的功能。自定義選擇功能,複製到剪貼板pure JS

如何通過修改下面的當前工作代碼來實現它?我不介意使用clipboard.js,jQuery位或自從Chrome 43以來推出的原生JS支持。我只是不知道如何從這裏繼續添加我需要的內容。

function selectPre(e) { 
    if (window.getSelection) { 
     var s = window.getSelection(); 
     if (s.setBaseAndExtent) { 
      s.setBaseAndExtent(e, 0, e, e.innerText.length - 1); 
     } 
     else { 
      var r = document.createRange(); 
      r.setStart(e.firstChild, 0); 
      r.setEnd(e.lastChild, e.lastChild.textContent.length); 
      s.removeAllRanges(); 
      s.addRange(r); 
     } 
    } 
    else if (document.getSelection) { 
     var s = document.getSelection(); 
     var r = document.createRange(); 
     r.selectNodeContents(e); 
     s.removeAllRanges(); 
     s.addRange(r); 
    } 
    else if (document.selection) { 
     var r = document.body.createTextRange(); 
     r.moveToElementText(e); 
     r.select(); 
    } 
} 
var diff = document.getElementById('diff_table').getElementsByTagName('tr'); 
var difflen = diff.length; 
for(i=0; i<difflen; i++) { 
    var newdiff = diff[i].childNodes[1]; 
    if (newdiff.className && (newdiff.className == 'added' || newdiff.className == 'modified')) { 
     newdiff.className += ' diff-select'; 
     newdiff.innerHTML = '<div class="btnbox"><button class="btn btn-default btn-xs" onclick="selectPre(this.parentNode.nextSibling)">Select</button></div>' + newdiff.innerHTML; 
    } 
} 
+0

我加了獎金。請幫助:) – user2513846

+3

你能否添加相關的html樣本? – rajuGT

+0

請添加與實際嘗試使用'clipboard.js'相關的代碼或您提到的其他解決方案之一。現在,它看起來像你遞給我們代碼,並要求我們向它注入一個解決方案。 – zero298

回答

3

出於某種原因,確實是您selectPre功能上覆制的的jsfiddle情況下是找不到的。 Jsfiddle可能會擺脫它認爲是死代碼或爲了縮小而重命名它。

但是,如果它所做的是選擇<pre>標記的內容,那麼clipboard.js庫(已準備好使用)可以自己完成。

所以你最終要求正確配置剪貼板對象。使用一個:

new Clipboard('.btn', { 
    // The targeting to the correct content is done here. 
    target: function(trigger) { 
     return trigger.parentNode.nextSibling; 
    } 
    // clipboard.js will take the entire inner content of the <pre>, 
    // I think this is what you are trying to do in your "selectPre" 
    // function, but I am not sure. 
}); 

它模仿你selectPre(this.parentNode.nextSibling),你不再需要連接到您的按鈕onclick屬性。

演示:http://jsfiddle.net/5k60nm1y/

注意,我猜你的表結構是什麼。它可能與您的實際表格不同,因此您可能需要微調newdiff分配給正確的單元格的方式。

如果您需要一些比<pre>標籤的內容更復雜的東西,可以通過將自定義函數傳遞給Clipboard構造函數選項的text屬性來微調Clipboard對象的行爲,而不是使用target財產。檢查剪貼板主頁,這是不言而喻的。如果你可以共享你的HTML表格,那麼你可以讓人們的任務更容易(並且你可能會得到更快的解決方案)。我不會需要猜測和創建一個假的。此外,我將爲您提供的代碼將直接適用於您的真實表格,而現在它可能仍需要定製。希望我猜對了,我的桌子靠近你。

+0

我設法適應這一點,並使其工作。非常感謝! – user2513846

+0

我很高興你終於可以使它工作! – ghybs

1

我將一段代碼從這個資源How do I copy to the clipboard in JavaScript?應用到您的代碼中,讓您輕鬆瞭解它是如何完成的。

我也修改了你的onclick="selectPre(...)"這個onclick="selectPre(this)"並在「selectPre」函數中增加了一些變量。

這裏也是一個Fiddle demo

function selectPre(b) { 
    var s;        // added - selection variable 
    var e = b.parentNode.nextSibling; // added - parent sibling element 
    if (window.getSelection) { 
     var s = window.getSelection(); 
     if (s.setBaseAndExtent) { 
      s.setBaseAndExtent(e, 0, e, e.innerText.length - 1); 
     } 
     else { 
      var r = document.createRange(); 
      r.setStart(e.firstChild, 0); 
      r.setEnd(e.lastChild, e.lastChild.textContent.length); 
      s.removeAllRanges(); 
      s.addRange(r); 
     } 
    } 
    else if (document.getSelection) { 
     var s = document.getSelection(); 
     var r = document.createRange(); 
     r.selectNodeContents(e); 
     s.removeAllRanges(); 
     s.addRange(r); 
    } 
    else if (document.selection) { 
     var s = document.body.createTextRange(); 
     s.moveToElementText(e); 
     s.select(); 
    } 

    // added - copy and change button text 
    if (s) { 
     try { 
      var successful = document.execCommand('copy'); 
      // var msg = successful ? 'successful' : 'unsuccessful'; 
      // console.log('Copying text command was ' + msg); 
      if (successful) { 
       b.innerHTML = "Copied"; 
      } 
     } catch (err) { 
      // console.log('Oops, unable to copy'); 
     } 
    } 
} 
var diff = document.getElementById('diff_table').getElementsByTagName('tr'); 
var difflen = diff.length; 
for(i=0; i<difflen; i++) { 
    var newdiff = diff[i].childNodes[1]; 
    if (newdiff.className && (newdiff.className == 'added' || newdiff.className == 'modified')) { 
     newdiff.className += ' diff-select'; 

     // altered - onclick handler 
     newdiff.innerHTML = '<div class="btnbox"><button class="btn btn-default btn-xs" onclick="selectPre(this)">Select</button></div>' + newdiff.innerHTML; 
    } 
} 
+0

我喜歡你在這裏做的和這個解決方案。當我第一次閱讀這本書時,我最終選擇了這個。 – user2513846

+0

我的想法與我的答案是讓你「看」它是如何工作的,使它更容易理解,然後從中學習如何/可以做什麼,所以我很高興它的工作......並且你選擇了什麼最適合你。 – LGSon

+0

我很高興你發佈,我從你學習發佈:) – user2513846