91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

前端復制問題

發布時間:2020-04-08 00:29:34 來源:網絡 閱讀:784 作者:夢想代碼 欄目:web開發

API介紹:
復制、剪切、粘貼事件:

copy 發生復制操作時觸發;
cut 發生剪切操作時觸發;
paste 發生粘貼操作時觸發;
每個事件都有一個before事件對應:beforecopy、beforecut、beforepaste;

這幾個before一般不怎么用,所以我們把注意力放在另外三個事件就可以了。
觸發條件:

鼠標右鍵菜單的復制、粘貼、剪切;

使用了相應的鍵盤組合鍵,比如:command+c、command+v;
就算你是隨便按的,也會觸發事件。高程中介紹在Chorme、Firefox和Safari中,這幾個before事件只會在真實會發生剪貼板事件的情況下觸發,IE上則可以觸發before。我實際測試的時候最新版chorme也會亂按也會觸發,所以限制應該是在早一點的版本上。
so 想說的是:before這幾個事件最好不要用,有關于剪切板的處理最好放在copy、cut、paste上面。

使用姿勢:
以copy為例:
document.body.oncopy = e => {
// 監聽全局復制 做點什么
}
// 還有這種寫法:
document.addEventListener("copy", e => {
// 監聽全局復制 做點什么
});
復制代碼
上面是在document.body上全局監聽的,然而很多人不知道的是,我們還可以為某些dom單獨添加剪切板事件:
// html結構
<div id="test1"></div>
<div id="test2"></div>
// 寫法一樣:
let test1 = document.querySelector('#test1');
test1.oncopy = e => {
// 監聽test1發生的復制事件 做點什么
// test1發生的復制事件會觸發回調,其他地方不會觸發回調
}
復制代碼
其他事件也是一樣的,這里就不贅述了。
clipboardData對象:用于訪問以及修改剪貼板中的數據
兼容:
不同瀏覽器,所屬的對象不同:在IE中這個對象是window對象的屬性,在Chrome、Safari和Firefox中,這個對象是相應的event對象的屬性。所以我們在使用的時候,需要做一下如下兼容:
document.body.oncopy = e => {
let clipboardData = (e.clipboardData || window.clipboardData);
// 獲取clipboardData對象 + do something
}
復制代碼
對象方法:
對象有三個方法: getData()、setData()、clearData()

getData() 訪問剪切板中的數據
參數: getData()接受一個'text'參數,即要取得的數據的格式。
在復制、剪切、粘貼觸發的事件的數據:
實際上在chorme上測試只有paste粘貼的時候才能用getData()訪問到數據,用法如下:
要粘貼的數據:
document.body.onpaste = e => {
let clipboardData = (e.clipboardData || window.clipboardData); // 兼容處理
console.log('要粘貼的數據', clipboardData.getData('text'));
}
復制代碼
被復制/剪切的數據:
在復制和剪切中的數據,需要通過window.getSelection(0).toString()來訪問:
document.body.oncopy = e => {
console.log('被復制的數據:', window.getSelection(0).toString());
}
復制代碼

setData(): 修改剪切板中的數據
參數:第一個參數也是'text',第二個參數是要放在剪切板中的文本。
剩下的留在下面仿知乎/掘金復制大段文本添加版權信息那里再說。

clearData() :
這個方法就不太知道了,試了好久不知道怎么用(如果有大佬知道,可以在評論區指點一下)。
如果只是為了禁止復制,或者禁止粘貼,在下面還有另外的方法可以做到,并且可以細粒化操作。

應用:
如果學習不是為了裝X,那么一切將毫無意義,來看這個東西可以在哪些場景使用:
實現類知乎/掘金復制大段文本添加版權信息:
實現很簡單:取消默認復制之后,主要是在被復制的內容后面添加信息,然后根據clipboardData的setData()方法將信息寫入剪貼板。
可以直接復制這段代碼到本地去試試。
// 掘金這里不是全局監聽,應該只是監聽文章的dom范圍內。
document.body.oncopy = event => {
event.preventDefault(); // 取消默認的復制事件
let textFont, copyFont = window.getSelection(0).toString(); // 被復制的文字 等下插入
// 防知乎掘金 復制一兩個字則不添加版權信息 超過一定長度的文字 就添加版權信息
if (copyFont.length > 10) {
textFont = copyFont + '\n'

  • '作者:OBKoro1\n'
  • '鏈接:https://juejin.im/user/58714f0eb123db4a2eb95372/posts\n'
  • '來源:掘金\n'
  • '著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。';
    } else {
    textFont = copyFont; // 沒超過十個字 則采用被復制的內容。
    }
    if (event.clipboardData) {
    return event.clipboardData.setData('text', textFont); // 將信息寫入粘貼板
    } else {
    // 兼容IE
    return window.clipboardData.setData("text", textFont);
    }
    }
    復制代碼
    然后command+c、command+v,輸出:
    你復制的內容
    作者:OBKoro1
    鏈接:https://juejin.im/user/58714f0eb123db4a2eb95372/posts
    來源:掘金
    著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
    復制代碼
    實現類起點網的防復制功能:

禁止復制+剪切
禁止右鍵,右鍵某些選項:全選,復制,粘貼等。
禁用文字選擇,能選擇卻不能復制,體驗很差。
user-select 用css禁止選擇文本。

可以把代碼拷到本地玩一玩:
// 禁止右鍵菜單
document.body.oncontextmenu = e => {
console.log(e, '右鍵');
return false;
// e.preventDefault();
};
// 禁止文字選擇。
document.body.onselectstart = e => {
console.log(e, '文字選擇');
return false;
// e.preventDefault();
};
// 禁止復制
document.body.oncopy = e => {
console.log(e, 'copy');
return false;
// e.preventDefault();
}
// 禁止剪切
document.body.oncut = e => {
console.log(e, 'cut');
return false;
// e.preventDefault();
};
// 禁止粘貼
document.body.onpaste = e => {
console.log(e, 'paste');
return false;
// e.preventDefault();
};
// css 禁止文本選擇 這樣不會觸發js
body {
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
}
復制代碼
PS:

使用e.preventDefault()也可以禁用,但建議使用return false這樣就不用去訪問e和e的方法了。
示例中document.body全局都禁用了,也可以對dom(某些區域)進行禁用。

破解防復制:
上面的防復制方法通過js+css實現的,所以思路就是:禁用js+取消user-select樣式。
Chrome瀏覽器的話:打開瀏覽器控制臺,按F1進入Setting,勾選Disable JavaScript(禁止js)。

此時如果還不能復制的話,就要去找user-select樣式,取消這個樣式就可以了。

所以那些盜版小說手打的,我真的不太能理解,Excuse me???
點擊復制功能:
不能使用clipboardData:
在IE中可以用window.clipboardData.setData('text','內容')實現。
上文提到過,在IE中clipboardData是window的屬性。
而其他瀏覽器則是相應的event對象的屬性,這實際上是一種安全措施,防止未經授權的訪問,為了兼容其他瀏覽器,所以我們不能通過clipboardData來實現這種操作。
具體做法:

創建一個隱藏的input框

點擊的時候,將要復制的內容放進input框中

選擇文本內容input.select()
這里只能用input或者textarea才能選擇文本。

document.execCommand("copy"),執行瀏覽器的復制命令。
function copyText() {
var text = document.getElementById("text").innerText; // 獲取要復制的內容也可以傳進來
var input = document.getElementById("input"); // 獲取隱藏input的dom
input.value = text; // 修改文本框的內容
input.select(); // 選中文本
document.execCommand("copy"); // 執行瀏覽器復制命令
alert("復制成功");
}

dome---實例
<div class="wrapper">
<p id="text">我把你當兄弟你卻想著復制我?</p>
<input id="input">
<button onclick="copyText()">copy</button>
</div>

.wrapper {position: relative;}
#input {
position:absolute;
top:-10000px;
opacity: 0;
z-inde:-10;
}

function copyText() {
  var text = document.getElementById("text").innerText;
  var input = document.getElementById("input");
  input.value = text; // 修改文本框的內容
  input.select(); // 選中文本
  document.execCommand("copy"); // 執行瀏覽器復制命令
  alert("復制成功");
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和龙市| 卓资县| 临洮县| 江源县| 江陵县| 叙永县| 垫江县| 宁津县| 凤庆县| 广德县| 四川省| 石柱| 新余市| 西充县| 临夏市| 丰镇市| 苍山县| 阳江市| 水富县| 祁连县| 滁州市| 黑山县| 维西| 门头沟区| 阜南县| 扬州市| 竹北市| 稻城县| 海阳市| 方山县| 万全县| 开阳县| 翼城县| 湄潭县| 虎林市| 台北县| 安远县| 堆龙德庆县| 新干县| 雅安市| 右玉县|