1. 程式人生 > >js實現ctrl+v粘貼圖片或是截圖

js實現ctrl+v粘貼圖片或是截圖

環境 fileread tar str div stand listen nod null

瀏覽器環境:谷歌瀏覽器

1.ctrl+v粘貼圖片都是監聽paste時間實現的,復制的數據都存在clipboardData下面,雖然打印顯示數據長度為0,但是還是可以獲取數據的

技術分享圖片

2.打印clipboardData.items發現是一個DataTransferItem。

技術分享圖片

3.DataTransferItem有個getAsFile()的方法,可以獲取文件

技術分享圖片
    document.addEventListener(paste, function (event) {
        console.log(event);
        var isChrome = false;
        
if (event.clipboardData || event.originalEvent) { //某些chrome版本使用的是event.originalEvent var clipboardData = (event.clipboardData || event.originalEvent.clipboardData); if(clipboardData.items){ // for chrome var items = clipboardData.items, len
= items.length, blob = null; isChrome = true; for (var i = 0; i < len; i++) { console.log(items[i]); if (items[i].type.indexOf("image") !== -1) { //getAsFile() 此方法只是living standard firefox ie11 並不支持
blob = items[i].getAsFile(); } } } } })
View Code

此時就可以獲取到blob對象了,這時候可以選擇顯示在頁面上,也可以選擇發送給後臺

3.1顯示圖片

  3.1.1執行下面代碼即可,使用blob對象顯示

技術分享圖片
  var blobUrl=URL.createObjectURL(blob);
       document.getElementById("imgNode").src=blobUrl;
View Code

效果圖

技術分享圖片

  3.1.2使用base64碼顯示,需要借助FileReader

技術分享圖片
reader.onload = function (event) {
                        // event.target.result 即為圖片的Base64編碼字符串
                        var base64_str = event.target.result;

                        document.getElementById("imgNode").src=base64_str;
                    }
                    reader.readAsDataURL(blob);
View Code

3.2上傳到後臺

  3.2.1生成formData,這裏生成formData,需要借助canvas

技術分享圖片
//借助canvas,生成formData
                    var canvas = document.createElement(canvas);
                    var dataURL = canvas.toDataURL(image/jpeg, 0.5);
                    var fd = new FormData(document.forms[0]);
                    fd.append("the_file", blob, image.png);
                    //創建XMLHttpRequest對象
                    var xhr = new XMLHttpRequest();
                    xhr.open(POST,/image );
                    xhr.onload = function () {
                        if ( xhr.readyState === 4 ) {
                            if ( xhr.status === 200 ) {
                                var data = JSON.parse( xhr.responseText );
                                console.log(data);
                            } else {
                                console.log( xhr.statusText );
                            }
                        };
                    };
                    xhr.onerror = function (e) {
                        console.log( xhr.statusText );
                    }
                    xhr.send(fd);
View Code

3.3完整代碼

完整代碼如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        body {
            display: -webkit-flex;
            display: flex;
            -webkit-justify-content: center;
            justify-content: center;
        }
    </style>
</head>
<body>
<textarea></textarea>
<div contenteditable style="width: 300px;height: 100px; border:1px solid">
    <img src="" id="imgNode">
</div>
</body>
<script>
    document.addEventListener(paste, function (event) {
        console.log(event);
        var isChrome = false;
        if (event.clipboardData || event.originalEvent) {
            //某些chrome版本使用的是event.originalEvent
            var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
            if(clipboardData.items){
                // for chrome
                var  items = clipboardData.items,
                    len = items.length,
                    blob = null;
                isChrome = true;
                for (var i = 0; i < len; i++) {
                    console.log(items[i]);
                    if (items[i].type.indexOf("image") !== -1) {
                        //getAsFile() 此方法只是living standard firefox ie11 並不支持
                        blob = items[i].getAsFile();
                    }
                }
                if(blob!==null){
                    var blobUrl=URL.createObjectURL(blob);
                    //blob對象顯示
                    document.getElementById("imgNode").src=blobUrl;
                    var reader = new FileReader();
                    //base64碼顯示
                   /* reader.onload = function (event) {
                        // event.target.result 即為圖片的Base64編碼字符串
                        var base64_str = event.target.result;

                        document.getElementById("imgNode").src=base64_str;
                    }
                    reader.readAsDataURL(blob);*/
                    //借助canvas,生成formData
                    var canvas = document.createElement(canvas);
                    var dataURL = canvas.toDataURL(image/jpeg, 0.5);
                    var fd = new FormData(document.forms[0]);
                    fd.append("the_file", blob, image.png);
                    //創建XMLHttpRequest對象
                    var xhr = new XMLHttpRequest();
                    xhr.open(POST,/image );
                    xhr.onload = function () {
                        if ( xhr.readyState === 4 ) {
                            if ( xhr.status === 200 ) {
                                var data = JSON.parse( xhr.responseText );
                                console.log(data);
                            } else {
                                console.log( xhr.statusText );
                            }
                        };
                    };
                    xhr.onerror = function (e) {
                        console.log( xhr.statusText );
                    }
                    xhr.send(fd);
                }
            }
        }
    })
</script>
</html>

js實現ctrl+v粘貼圖片或是截圖