瀏覽器復制、剪切、粘貼事件簡單操作示例


更多參考:點這里

復制、剪切、粘貼事件:

  • copy 發生復制操作時觸發;
  • cut 發生剪切操作時觸發;
  • paste 發生粘貼操作時觸發;

每個事件都有一個 before 事件對應:beforecopy、beforecut、beforepaste;
這幾個 before 一般不怎么用,所以我們把注意力放在三個事件就可以了。

copy復制操作:

copy事件使用示例:

<body>
	gggwgzgf
</body>
<script type="text/javascript">
	document.body.oncopy = e => {
	  // 監聽全局復制 做點什么
	  console.log(e)
	};
</script>
在這里插入圖片描述

我們可以看到事件對象中的屬性:

在這里插入圖片描述

我們主要研究的是里面的clipboardData屬性對象

clipboardData 對象: 用於訪問以及修改剪貼板中的數據
clipboardData對象中有兩個方法:

setData():常配合copy事件使用,用於設置到剪貼板中的值

getData():常配合paste事件使用,用於獲取設置到剪貼板中的值

不同瀏覽器,所屬的對象不同:在 IE
中這個對象是window對象的屬性,在Chrome、Safari和Firefox中,這個對象是相應的event對象的屬性。所以我們在使用的時候,需要做一下如下兼容:

document.body.oncopy = e => {
  let clipboardData = e.clipboardData || window.clipboardData;
  // 獲取clipboardData對象 + do something
};

copy配合getSelection實現復制某段文本

<body>
		gggwgzgf
	</body>
	<script type="text/javascript">
		document.body.oncopy = e => {
			console.log(window.getSelection().toString())
			let copyMsg = window.getSelection().toString()
			//把值設置到剪貼板中,方便paste事件觸發去拿
			e.clipboardData.setData("Text", copyMsg);
		};
	</script>
在這里插入圖片描述

注意:window.getSelection().toString()我是調用toString()方法轉成文本的,如果不調用這個方法,直接通過window.getSelection()取到值存到剪貼板會有出奇的效果,會連同效果一起粘貼(比如html格式的,會隱性地把<body>什么都復制進去),需要配合paste事件

paste粘貼事件

<body>
		gggwgzgf
		<input placeholder="這里存放粘貼操作的值" />
	</body>
	<script type="text/javascript">
		document.body.oncopy = e => {
			console.log(window.getSelection().toString())
			let copyMsg = window.getSelection().toString()
			e.clipboardData.setData("Text", copyMsg);
		};
		
		document.body.onpaste=function(e){
				var data = e.clipboardData.getData("Text")
				document.querySelector("input").value = data
			}
	</script>
在這里插入圖片描述

通過patse事件獲取剪切板中的圖片:

<script type="text/javascript">
		document.addEventListener('paste', function(event) {
			var items = (event.clipboardData && event.clipboardData.items) || [];
			var file = null;
			if(items && items.length) {
				for(var i = 0; i < items.length; i++) {
					if(items[i].type.indexOf('image') !== -1) {
						file = items[i].getAsFile();
						break;
					}
				}
			}
			console.log(file)
		});
</script>

解釋: 當粘貼事件觸發時遍歷剪切版對象(clipboardData)中的所有items,找到類型為圖片的item並調用getAsFile方法得到文件對象

拿到file 對象后我們有幾種選擇:

  1. 通過fileReader得到文件對象的base64字符串
var reader = new FileReader();
reader.onload = function(e){
// 通過e.target.result取到base64然后上傳
// 作為src設到image標簽上預覽
}
reader.readAsDataURL(file); //此處的file為上面得到的文件對象```
  1. 通過formData文件對象轉換為二進制數據
var formData = new FormData();
formData.append('file', file);
  1. 通過 URL.createObjectURL轉成url地址預覽
var blobUrl=URL.createObjectURL(file)

示例代碼:

<body>
		<img src="" id="imgTest" />
	</body>
	<script type="text/javascript">
		document.addEventListener('paste', function(event) {
			var items = (event.clipboardData && event.clipboardData.items) || [];
			var file = null;
			if(items && items.length) {
				for(var i = 0; i < items.length; i++) {
					if(items[i].type.indexOf('image') !== -1) {
						file = items[i].getAsFile();
						break;
					}
				}
			}
			var blobUrl = URL.createObjectURL(file);
			document.getElementById("imgTest").src = blobUrl;
		});
	</script>
在這里插入圖片描述

局限性:
對於qq,微信等的截圖或者按print screen得到的截圖,還有任意網頁的右擊復制圖片都能完美支持,但是,對於電腦本地圖片文件的復制沒辦法從剪切版獲取到


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM