热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js粘貼圖片的運用(clipboardData)

clipboardData原由:應項目需求,須要用某個東西截圖然後粘貼上傳到背景的功用!因而動手搜尋材料,終究的效果就是找到了這個對象clipboardData,然後最先動手!一、
clipboardData

原由:應項目需求,須要用某個東西截圖然後粘貼上傳到背景的功用!因而動手搜尋材料,終究的效果就是找到了這個對象clipboardData,然後最先動手!

一、谷歌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 // console.log(items[i]);
if (items[i].type.indexOf("image") !== -1) {
//getAsFile() 此要領只是該瀏覽器下才會有的要領
fileObj = items[i].getAsFile();
}
}
if(fileObj !== null) {
fileObj就是一個文件對象,如今就能夠舉行文件的處理了,例如用formdata的情勢傳遞給背景,這個自行百度,本片章不與報告。
} }}

假如須要在頁面中顯現能夠有兩種要領顯現圖片

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

URL是一個公用的對象

第二種要領是用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 slice = byteCharacters.slice(offset, offset + sliceSize);
byteNumbers = new Array(slice.length);
i = 0;
while (i 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 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 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;
};


$('.input').on('paste', function (event) {
_checkImagesInContainer($('.input'), function (src) {
_handleImage(src, $('.input'))
})

})

推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • 本文讨论了在Vue组件中,为什么data属性要返回一个函数的问题。通过示例代码,说明了对象变量和对象函数在数据更改前后的影响。 ... [详细]
author-avatar
人帅刀快爱美女_915
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有