【目錄】
- 明確需求
- html分析
- 程式碼實現
- css分析
- js分析
- 程式碼實現
只要是文字,長按選中就可以複製,但是需求來了擋也擋不住:
明確需求
為了提升使用者體驗,點選【複製】按鈕就自動複製到剪貼簿,那麼就需要前端實現這種功能了。
首先明確了需求就先看一下最終圖片:
html分析
左邊是一個input的文字框,只讀,右邊是一個按鈕。
程式碼實現:
<!--左邊是一個input輸入框,要求只讀,而且裡面的內容通過url?後面的code傳入-->
<input type="text" value="AJS4EFS" readonly id="textAreas"/>
<!--右邊是一個按鈕-->
<a href="javascript:;" class="cuteShareBtn" id="copy">複製</a>
複製程式碼
css分析
這種東西就跳過吧,不是重點。
js分析
- 點選按鈕獲取input物件
解決方法:
- 如果使用的jquery,那麼直接$("#textArea").select()選中的就是這個input物件
- 如果使用的zepto,上面的方法是獲取到的zepto物件是不支援原生select()方法的,那麼就使用原生的辦法
var obj = document.getElementById("textAreas");
obj.select();
- 然後複製到剪貼簿
兩行?看起來是不是很簡單?哈哈~那你就錯了,這裡面是有坑的。 第一目前沒有一個很完美的方法可以相容各個瀏覽器和移動端,引用外掛也是一樣的。 查了半天最好的辦法就是使用 document.execCommand("Copy") 相容性是不錯的:
手機安卓支援到4.1、各種瀏覽器是可以的,但是唯獨ios是不支援的,來給我把刀,ios你這玩意你限制是幹什麼?是要保護手機安全還是咋的。 所以只是pc端 使用那麼就下面幾行程式碼就可以搞定了:
程式碼實現
//複製按鈕事件繫結
$("#copy").on("tap",function(){
//獲取input物件
var obj = document.getElementById("textAreas");
//選擇當前物件
obj.select();
try{
//進行復制到剪下板
if(document.execCommand("Copy","false",null)){
//如果複製成功
alert("複製成功!");
}else{
//如果複製失敗
alert("複製失敗!");
}
}catch(err){
//如果報錯
alert("複製錯誤!")
}
})
複製程式碼
那如果是移動端 的話,就要相容IOS,但是依然在iPhone5的10.2的系統中,依然顯示覆制失敗,由於使用者使用率較低,相容就做到這裡,那些使用者你們就自己手動複製吧。 下面的兩種方法都可以進行復制,因為核心程式碼就那麼幾行,先來簡單的:
$("#copy").on("tap",function(){
//獲取input物件
var obj = document.getElementById("textAreas");
//如果是ios端
if(isiOSDevice){
// 獲取元素內容是否可編輯和是否只讀
var editable = obj.contentEditable;
var readOnly = obj.readOnly;
// 將物件變成可編輯的
obj.contentEditable = true;
obj.readOnly = false;
// 建立一個Range物件,Range 物件表示文件的連續範圍區域,如使用者在瀏覽器視窗中用滑鼠拖動選中的區域
var range = document.createRange();
//獲取obj的內容作為選中的範圍
range.selectNodeContents(obj);
var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
obj.setSelectionRange(0, 999999); //選擇範圍,確保全選
//恢復原來的狀態
obj.contentEditable = editable;
obj.readOnly = readOnly;
//如果是安卓端
}else{
obj.select();
}
try{
if(document.execCommand("Copy","false",null)){
alert("複製成功!");
}else{
alert("複製失敗!請手動複製!");
}
}catch(err){
alert("複製錯誤!請手動複製!")
}
})
複製程式碼
下面是一個比較完整的升級版方法,和外掛Clipboard.js一樣,不過程式碼不多,就直接拿來用好了。 這個獲取的不是input物件,而是需要複製的內容。
//定義函式
window.Clipboard = (function(window, document, navigator) {
var textArea,
copy;
// 判斷是不是ios端
function isOS() {
return navigator.userAgent.match(/ipad|iphone/i);
}
//建立文字元素
function createTextArea(text) {
textArea = document.createElement('textArea');
textArea.value = text;
document.body.appendChild(textArea);
}
//選擇內容
function selectText() {
var range,
selection;
if (isOS()) {
range = document.createRange();
range.selectNodeContents(textArea);
selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
textArea.setSelectionRange(0, 999999);
} else {
textArea.select();
}
}
//複製到剪貼簿
function copyToClipboard() {
try{
if(document.execCommand("Copy")){
alert("複製成功!");
}else{
alert("複製失敗!請手動複製!");
}
}catch(err){
alert("複製錯誤!請手動複製!")
}
document.body.removeChild(textArea);
}
copy = function(text) {
createTextArea(text);
selectText();
copyToClipboard();
};
return {
copy: copy
};
})(window, document, navigator);
複製程式碼
使用函式
//使用函式
$("#copy").on("tap",function(){
var val = $("#textAreas").val();
Clipboard.copy(val);
});
複製程式碼
這樣就實現了前端點選按鈕自動複製剪貼簿的功能。 version1.0 —— 2018/5/6,首次建立實現前端點選按鈕自動複製剪貼簿功能 ©burning_韻七七