js 粘貼圖片的應用(clipboardData)

clipboardData

原由:應項目需求,須要用某個工具截圖而後粘貼上傳到後臺的功能!因而着手搜查資料,最終的結果就是找到了這個對象clipboardData,而後開始着手!html

1、谷歌chrome瀏覽器

相信這個也是不少開發者都在用的瀏覽器,固然也是嘗試的開始。整個過程是這樣的chrome

1)使用微信截圖
2)`'⌘+v, ctrl+v'`在這個頁面的隨意位置粘貼
3)執行上傳圖片到後臺的流程(產生loading狀態)
document.body.addEventListener('paste', files, false)
//files是一個方法,裏面的參數爲event
function files(event) {
    //谷歌瀏覽器的的粘貼文件在這個對象下面
    if (event.clipboardData || event.originalEvent) {
        var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
        
        //獲取文件的屬性就在這裏獲取,打印該對象能夠看到相關屬性,結果的操做就在items裏面,因此須要循環items
        let fileObj = null
        for (var i = 0; i < len; i++) {
              // console.log(items[i]);
              if (items[i].type.indexOf("image") !== -1) {
                  //getAsFile() 此方法只是該瀏覽器下才會有的方法 
                  fileObj = items[i].getAsFile();
              }
          }
        if(fileObj !== null) {
          fileObj就是一個文件對象,此刻就能夠進行文件的處理了,例如用formdata的形式傳遞給後臺,這個自行百度,本片章不與講述。
        }
        
        
    }
    
}

若是須要在頁面中顯示能夠有兩種方法顯示圖片canvas

第一種
在上面的代碼if處接着寫
if(fileObj !== null) {
    var fileUrl=URL.createObjectURL(blob);
    document.getElementById("imgNode").src=fileUrl;
}

URL是一個公用的對象segmentfault

第二種方法是用base64的方法能夠實現, 須要藉助FileReader對象
var reader = new FileReader();
reader.onload = function (event) {
  //event.target.result 即爲圖片的Base64編碼字符串
   var base64_str = event.target.result;
   document.getElementById("imgNode").src=base64_str;
}
 reader.readAsDataURL(blob);

以上就是在谷歌瀏覽器中實現的方法了!可是僅限在谷歌瀏覽器,由於此項目在mac上開發,因此就嘗試了在safari中試着運行,結果一點反應都沒有,哎,相繼查了不少的資料才懂了一點點,這裏也就簡單的分享下,但願對這一塊比較有深刻了解的人來評論、指導下我。跨域

問題1

document.body下的onpaste不起做用,如今也沒有查到,因而乎只能在div(contenteditable)下嘗試了一下下。可是發現clipboardData下面並無items這個對象,因此上面的方法也就不成立了,具體的哪些數據能夠參考這篇文章,上面介紹了他屬性的一些要求,因此只能另謀方法了!查閱了好多資料明白了一些!
safari粘貼的數據根本就沒有存在clipboardData這個對象下,而是在這個div下添加了一個圖片,新建了一個img標籤,而後src指向本地的blob連接數據,不信的話大家能夠本身打印一下。瀏覽器

因此想要獲取對象只能這樣了,具體代碼以下,藉助jq

base64轉換爲blob對象

function dataURLtoBlob(dataURL, sliceSize) {
    var b64Data, byteArray, byteArrays, byteCharacters, byteNumbers, contentType, i, m, offset, ref, slice;
    if (sliceSize == null) {
      sliceSize = 512;
    }
    if (!(m = dataURL.match(/^data\:([^\;]+)\;base64\,(.+)$/))) {
      return null;
    }
    ref = m, m = ref[0], contentType = ref[1], b64Data = ref[2];
    byteCharacters = atob(b64Data);
    byteArrays = [];
    offset = 0;
    while (offset < byteCharacters.length) {
      slice = byteCharacters.slice(offset, offset + sliceSize);
      byteNumbers = new Array(slice.length);
      i = 0;
      while (i < slice.length) {
        byteNumbers[i] = slice.charCodeAt(i);
        i++;
      }
      byteArray = new Uint8Array(byteNumbers);
      byteArrays.push(byteArray);
      offset += sliceSize;
    }
    return new Blob(byteArrays, {
      type: contentType
    });
  };

base64 轉爲 文件對象

function dataURLtoFile(dataurl, filename) {
      var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
          bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
      while(n--){
          u8arr[n] = bstr.charCodeAt(n);
      }
      return new File([u8arr], filename, {type:mime});
  }

查找瀏覽器添加的圖片標籤

var _checkImagesInContainer = function(that,cb) {
    var img, j, len, ref, timespan;
    timespan = Math.floor(1000 * Math.random());

    ref = that.find('img');
    for (j = 0, len = ref.length; j < len; j++) {
      img = ref[j];
      img["_paste_marked_" + timespan] = true;
    }
    return setTimeout((function(_this) {
      return function() {
        var k, len1, ref1;
        ref1 = _this.find('img');
        for (k = 0, len1 = ref1.length; k < len1; k++) {
          img = ref1[k];
          if (!img["_paste_marked_" + timespan]) {
            cb(img.src);
            $(img).remove();
          }
        }
      };
    })(that), 1);
 };

結果運行

_handleImage = function(src, e, name) {
    var loader;
    loader = new Image();
    loader.crossOrigin = "anonymous";
    loader.onload = (function(_this) {
      return function() {
        var blob, canvas, ctx, dataURL;
        canvas = document.createElement('canvas');
        canvas.width = loader.width;
        canvas.height = loader.height;
        ctx = canvas.getContext('2d');
        ctx.drawImage(loader, 0, 0, canvas.width, canvas.height);
        dataURL = null;
        try {
          dataURL = canvas.toDataURL('image/png'); //使用這個圖片的時候須要加入這個屬性crossOrigin,由於須要開啓容許跨域
          blob = dataURLtoBlob(dataURL);
          console.log(dataURLtoFile(dataURL, 'test'))
        } catch (error) {}
        if (dataURL) {
          // _this._target.trigger('pasteImage', {
          //   blob: blob,
          //   dataURL: dataURL,
          //   width: loader.width,
          //   height: loader.height,
          //   originalEvent: e,
          //   name: name
          // });
        }
      };
    })(this);
    return loader.src = src;
  };
<div class="input" contenteditable></div>
$('.input').on('paste', function (event) {
   _checkImagesInContainer($('.input'), function (src) {
       _handleImage(src, $('.input'))
   })
        
})
相關文章
相關標籤/搜索