火狐保暖衣 电池11v电池充多久

js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
转载 & & 作者:djuny
这篇文章主要介绍了js实现ctrl+v粘贴上传图片,兼容chrome,firefox,ie11,感兴趣的小伙伴们可以参考一下
我们或多或少都使用过各式各样的富文本编辑器,其中有一个很方便功能,复制一张图片然后粘贴进文本框,这张图片就被上传了,那么这个方便的功能是如何实现的呢?
提取操作:复制=&粘贴=&上传
在这个操作过程中,我们需要做的就是:监听粘贴事件=&获取剪贴板里的内容=&发请求上传
为方便理解下文,需要先明白几点:
我们只能上传网页图(在网页上右键图片,然后复制)和截图(截图工具截的图片,eg:qq截图),不能粘贴上传系统里的图片(从桌面上、硬盘里复制),他们是存在完全不同的地方的。
截图工具截的图与在网页点击右键复制的图是有些不同的,因此处理方式也不一样。
知悉paste event这个事件:当进行粘贴(右键paste/ctrl+v)操作时,该动作将触发名为'paste'的剪贴板事件,这个事件的触发是在剪贴板里的数据插入到目标元素之前。如果目标元素(光标所在位置)是可编辑的元素(eg:设置了contenteditable属性的div。textarea并不行。),粘贴动作将把剪贴板里的数据,以最合适的格式,插入到目标元素里;如果目标元素不可编辑,则不会插入数据,但依然触发paste event。数据在粘贴的过程中是只读的。此段是翻译于w3.org_the-paste-action。
可惜的是,经过试验,发现chrome(当前最新版)、firefox(当前最新版)、ie11对paste事件的实现并不是完全按照w3c来的,各自也有区别(w3c的paste标准也因此只是草案阶段)。
test代码及截图如下:
&textarea &&/textarea&
&div contenteditable style="width: 100height: 100 border:1px solid"&
document.addEventListener('paste', function (event) {
console.log(event)
event有clipboardData属性,且clipboardData有item属性,clipboardData.item中的元素(对象)有type和kind属性;
无论在哪进行粘贴,均可触发paste事件;
在div(未特殊声明时,本文div均指设置了contenteditable属性的div) 里粘贴截图,不显示图片。img.src为base64编码字符串;
在div里粘贴网页图片,直接显示图片,img.src为图片地址。
event有clipboardData属性,clipboardData没有item属性;
只有在textarea里或者可编辑的div(里才粘贴才触发paste事件;
在div里粘贴截图,直接显示图片,img.src为base64编码字符串;
在div里粘贴网页图片,表现同chrome。
ie11:(不截图了,可自行试验,其他浏览器同理&( ̄▽ ̄)/,因为懒...)
event没有clipboardData属性;
只在可编辑的div中粘贴才触发paste事件;
在div里粘贴截图,直接显示图片,img.src为base64编码字符串;
在div里粘贴网页图片,表现同chrome。
监听了paste事件,也知道了表现形式,接下来就是如何获取数据了:
chrome有特定的方法,利用clipboardData.items、getAsFile()、new FileReader()等api可以在paste回调函数里获取到剪贴板里图片的base64编码字符串(无论是截图粘贴的还是网页图片复制粘贴的),ie11,firefox没有这样的api,不过依然有办法可以获取,因为数据已经表现在img的src里了,对于截图粘贴的,直接取img的src属性值(base64),对于网页粘贴的,则把地址传给后台,然后根据地址down下来,存在自己的服务器,最后把新地址返回来交给前端展示就ok了。为了保持一致性便于管理,统一将所有情况(截图、网页)中的img的src属性替换为自己存储的地址。因此可以得到以下核心代码(注释很全哦~~):
html展示:
&meta charset="UTF-8"&
&title&Document&/title&
display: -webkit-
-webkit-justify-content:
justify-content:
#tar_box {
width: 500
height: 500
前端js处理逻辑:
document.addEventListener('paste', function (event) {
console.log(event)
var isChrome =
if ( event.clipboardData || event.originalEvent ) {
//not for ie11
某些chrome版本使用的是event.originalEvent
var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);
if ( clipboardData.items ) {
// for chrome
items = clipboardData.items,
len = items.length,
isChrome =
//items.length比较有意思,初步判断是根据mime类型来的,即有几种mime类型,长度就是几(待验证)
//如果粘贴纯文本,那么len=1,如果粘贴网页图片,len=2, items[0].type = 'text/plain', items[1].type = 'image/*'
//如果使用截图工具粘贴图片,len=1, items[0].type = 'image/png'
//如果粘贴纯文本+HTML,len=2, items[0].type = 'text/plain', items[1].type = 'text/html'
// console.log('len:' + len);
// console.log(items[0]);
// console.log(items[1]);
// console.log( 'items[0] kind:', items[0].kind );
// console.log( 'items[0] MIME type:', items[0].type );
// console.log( 'items[1] kind:', items[1].kind );
// console.log( 'items[1] MIME type:', items[1].type );
//阻止默认行为即不让剪贴板内容在div中显示出来
event.preventDefault();
//在items里找粘贴的image,据上面分析,需要循环
for (var i = 0; i & i++) {
if (items[i].type.indexOf("image") !== -1) {
// console.log(items[i]);
// console.log( typeof (items[i]));
//getAsFile() 此方法只是living standard firefox ie11 并不支持
blob = items[i].getAsFile();
if ( blob !== null ) {
var reader = new FileReader();
reader.onload = function (event) {
// event.target.result 即为图片的Base64编码字符串
var base64_str = event.target.result
//可以在这里写上传逻辑 直接将base64编码的字符串上传(可以尝试传入blob对象,看看后台程序能否解析)
uploadImgFromPaste(base64_str, 'paste', isChrome);
reader.readAsDataURL(blob);
//for firefox
setTimeout(function () {
//设置setTimeout的原因是为了保证图片先插入到div里,然后去获取值
var imgList = document.querySelectorAll('#tar_box img'),
len = imgList.length,
src_str = '',
for ( i = 0; i & i ++ ) {
if ( imgList[i].className !== 'my_img' ) {
//如果是截图那么src_str就是base64 如果是复制的其他网页图片那么src_str就是此图片在别人服务器的地址
src_str = imgList[i].
uploadImgFromPaste(src_str, 'paste', isChrome);
//for ie11
setTimeout(function () {
var imgList = document.querySelectorAll('#tar_box img'),
len = imgList.length,
src_str = '',
for ( i = 0; i & i ++ ) {
if ( imgList[i].className !== 'my_img' ) {
src_str = imgList[i].
uploadImgFromPaste(src_str, 'paste', isChrome);
function uploadImgFromPaste (file, type, isChrome) {
var formData = new FormData();
formData.append('image', file);
formData.append('submission-type', type);
var xhr = new XMLHttpRequest();
xhr.open('POST', '/upload_image_by_paste');
xhr.onload = function () {
if ( xhr.readyState === 4 ) {
if ( xhr.status === 200 ) {
var data = JSON.parse( xhr.responseText ),
tarBox = document.getElementById('tar_box');
if ( isChrome ) {
var img = document.createElement('img');
img.className = 'my_img';
img.src = data.store_
tarBox.appendChild(img);
var imgList = document.querySelectorAll('#tar_box img'),
len = imgList.length,
for ( i = 0; i & i ++) {
if ( imgList[i].className !== 'my_img' ) {
imgList[i].className = 'my_img';
imgList[i].src = data.store_
console.log( xhr.statusText );
xhr.onerror = function (e) {
console.log( xhr.statusText );
xhr.send(formData);
用express.js搭的简易后台的接收逻辑:
router.post('/', upload.array(), function (req, res, next) {
//1.获取客户端传来的src_str字符串=&判断是base64还是普通地址=&获取图片类型后缀(jpg/png etc)
//=&如果是base64替换掉"前缀"("data:image\/base64," etc)
//2.base64 转为 buffer对象 普通地址则先down下来
//3.写入硬盘(后续可以将地址存入数据库)
//4.返回picture地址
var src_str = req.body.image,
timestamp = new Date().getTime();
if ( src_str.match(/^data:image\/base64,|^data:image\/base64,|^data:image\/base64,|^data:image\/base64,/) ) {
//处理截图 src_str为base64字符串
var pic_suffix = src_str.split(';',1)[0].split('/',2)[1],
base64 = src_str.replace(/^data:image\/base64,|^data:image\/base64,|^data:image\/base64,|^data:image\/base64,/, ''),
buf = new Buffer(base64, 'base64'),
store_path = 'public/images/test_' + timestamp + '.' + pic_
fs.writeFile(store_path, buf, function (err) {
if (err) {
res.json({'store_path': store_path});
} else {// 处理非chrome的网页图片 src_str为图片地址
var temp_array = src_str.split('.'),
pic_suffix = temp_array[temp_array.length - 1],
store_path = 'public/images/test_' + timestamp + '.' + pic_suffix,
wstream = fs.createWriteStream(store_path);
request(src_str).pipe(wstream);
wstream.on('finish', function (err) {
if( err ) {
res.json({"store_path": store_path});
需要node环境:安装node=&npm intall=&node app.js)
以上就是本文的全部内容,希望对大家的学习有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具本文是对上一节的补充:
使用Selenium2(webdriver)启动firefox且自动加载firebug插件时,切换到firebug插件的网络和cookies部分时,提示面板已被禁用,如下图所示:
于是我们输入about:config在firefox设置页面试着去找下是否有什么参数控制着面板的禁用/启用,果然被我找到如下两个参数:
cookies面板 --- &extensions.firebug.cookies.enableSites
网络面板   --- &extensions.firebug.net.enableSites
  firefox设置页面参数非常的多,如果我们不知道某项设置的参数名时,我们可以手工在firefox界面设置参数的值,然后根据我们定制的值去about:config里面找就可以找到,从而找到我们要设置的参数。
在代码中设置这两个参数的值为true,运行结果如下:
代码如下:
public static void StartFireFoxLoadPlugin(){
System.out.println("start firefox browser...");
System.setProperty("webdriver.firefox.bin",
"D:/Program Files/Mozilla Firefox/firefox.exe");
File file = new File("files/firebug-1.9.0-fx.xpi");
FirefoxProfile profile = new FirefoxProfile();
profile.addExtension(file);
} catch (IOException e) {
e.printStackTrace();
//设置firebug版本
profile.setPreference("extensions.firebug.currentVersion", "1.9.0");
//自动打开firebug
profile.setPreference("extensions.firebug.allPagesActivation", "on");
//设置启用firebug网络面板
profile.setPreference("extensions.firebug.net.enableSites", true);
//设置启用firebugcookies面板
profile.setPreference("extensions.firebug.cookies.enableSites", true);
WebDriver driver = new FirefoxDriver(profile);
driver.get("http://www.baidu.com");
System.out.println("start firefox browser succeed...");
阅读(...) 评论()比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
火狐升级版修复11个漏洞 备战全球黑客大赛
关键字:Pwn20wn 火狐 全球黑大赛 修复漏洞
  北京时间3月3日消息,据国外媒体报道,火狐(Firefox)开发商基金会周二表示,已发布火狐3.6.14版,该升级版修复了3.6.13版存在的11个安全漏洞。火狐的此次最新升级,也是为了备战下周举行的Pwn2Own全球大赛。
  Mozilla称,在已经修复的11个漏洞中,9个危害级别为“危急”(critical),1个为“高级” (high),另1个为“中等”(moderate)。利用这些漏洞,网络犯罪者可向用户发起远程攻击,进而在用户机器中安装恶意软件。Mozilla还对较老的火狐3.5版进行了升级,最新版本为3.5.17版。
  Mozilla上一次发布火狐升级版的时间为去年12月中旬。多数情况下,Mozilla会每月发布一个升级版。据悉,Mozilla原定于今年2月中旬发布火狐升级版,但由于一个非安全漏洞问题而推迟。
  Mozilla周二强调指出,火狐最新升级版修复了JPEG图片渲染技术存在的两个漏洞。利用这两个漏洞,网络犯罪者可向用户发送含有的图片,从而使用户机器受到感染。
  备战Pwn2Own大会
  Mozilla发布火狐最新升级版,也是为了给下周举行的Pwn2Own全球黑客大赛作准备。2011年度Pwn2Own黑客大赛将于下周在加拿大温哥华市举行,届时参赛者将对IE、火狐、Chrome及Safari等主流浏览器发起攻击。为备战本年度Pwn2Own大赛,谷歌本周一也修复了其Chrome浏览器存在的19个安全漏洞。
  在去年Pwn2Own大赛举行数天前,谷歌和苹果皆发布了各自浏览器升级版,但Mozilla没有这样做。Pwn2Own大赛当时作出规定,参赛者必须找到火狐的新漏洞,利用已被公布的技术漏洞攻破火狐则视为无效。
[ 责任编辑:姜静 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte}

我要回帖

更多关于 火狐保暖衣 电池 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信