实现复制或截图可直接粘贴图片

在很多富文本编辑器或者编辑框中添加图片,都是通过点击按钮-选择图片-上传的形式,这需要使用者先保存好图片。

在有些情况下,实现截图或复制图片后直接粘贴图片,让操作更简单。

例如,在textarea中粘贴图片,通过监听paste动作来获取粘贴板中的图片数据,并将图片上传到服务器上,获取图片的url后在指定的地方显示,一般是将图片插入textarea中光标所在的地方。

实现过程只需要一个js文件

var input = document.getElementsByTagName("textarea")[0];
input.addEventListener(‘paste‘, pasteHandler);

/*Handle paste event*/
function pasteHandler(e){    //e:  ClipboardEvent
    //check if event.clipboardData is supported(chrome)
    if(e.clipboardData){
        var items = e.clipboardData.items;
        if(items){
            for(var i=0;i<items.length;i++){
                if(items[i].kind == ‘file‘ || items[i].type.indexOf(‘image‘) > -1){
                    //need to represent the image as a file
                    var blob = items[i].getAsFile();

                    var reader = new FileReader();
                    //need base64 to upload to server
                    reader.readAsDataURL(blob);
                    reader.onload = function(e) {   // ProgressEvent
                        uploadFile(e.target.result);  //or reader.result
                    }
                }
            }
        }
    }
};

var uploadFile = function (src) {
    var fileBase64 = src.split(",")[1];
    var data = [{
        base64: fileBase64
    }];
    $.ajax({
        type: "POST",
        url: "/feedback/attach/upload",
        data: JSON.stringify({data:data}),
        dataType: "json",
        contentType: "application/json",
        success: function(data){
            if (200 == data.code && data.msg.attachments && data.msg.attachments.length) {
                var attachs = data.msg.attachments;

                var liNode = document.createElement("li");
                var imageNode = document.createElement(‘img‘);
                imageNode.setAttribute(‘src‘,attachs[0].thumbUrl);
                $(liNode).attr("data-fileId", attachs[0].fileId);
                $(liNode).attr("data-url", attachs[0].url);

                liNode.appendChild(imageNode);
                document.getElementById(‘images-paste‘).appendChild(liNode);

            }
        },
        error: function(err){
            console.log(err);
        }
    });
};

1.   document.getElementsByTagName("textarea"), getElementsByTagName拿出来的是一个数组,在当前页面只有一个

textarea  document.getElementsByTagName("textarea")[0]获得,但是建议用document.getElementsById()方法。

2.   通过dom节点的addEventListener方法监听paste动作,并作出相应的js处理

3.   e是一个event对象ClipboardEvent,通过 e.clipboardData 可获取剪贴板中的数据,并且可以通过 clipboard.items[i].type.indexOf(‘image‘)来判断数据是不是图片

4.   获取图片文件,通过getAsFile()方法获取图片的二进制数据

5.   读取文件,用FileReader来读取本地文件

通过 reader.readAsDataURL(imageFile);将图片文件转化为dataURL,即  data:image/png;base64,xxx  形式的url,将它放在image元素的src中可以将本地文件显示出来。(前提是能够拿到本地文件)

6.  当读取操作成功时,调用 reader.onload,同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.

e对象为 ProgressEvent, this.result(this:reader)就是e.target.result,即图片的base64

7.  用base64将图片上传至服务器

在dataURL中获取base64编码  ,上传至服务器

var fileBase64 = src.split(",")[1]

8.  从服务器返回图片url后,将图片放在id为images-paste的div中,若要放在光标处,需要另外写js处理

注意:在获取剪切板文件时,只有chrome浏览器可以支持,chrome 通过clipboardData对象获取剪切板中的文件

chrome浏览器的clipboardData.items属性与getAsFile方法结合使用,可获得剪切板中的文件的二进制数据

  Firefox 14.0.1 Chrome 22.0 Safari 6.0 IE 9.0 Opera 12.01
paste event Yes Yes Yes Yes No
paste event on non-editable element No Yes No No No
clipboardData No Yes Yes Yes No
clipboardData.types No Yes Yes No No
clipboardData.items No Yes No No No
clipboardData.getData No Yes Yes Yes No
clipboardData.setData No Yes Yes Yes No
mime types No Yes Yes No No
custom types No Yes Yes Yes No
event.clipboardData No Yes Yes No No
window.clipboardData No No No Yes No

参见:

1.   MDN WEB API    https://developer.mozilla.org/zh-CN/docs/Web/API 

2.  Pasting image from clipboardData object      http://codebits.glennjones.net/copypaste/pasteimagedata.htm

3.  Clipboard API and events      https://w3c.github.io/clipboard-apis/

时间: 2024-08-08 16:56:09

实现复制或截图可直接粘贴图片的相关文章

chrome及safari浏览器实现直接粘贴图片(纯JS)

相信大家在一些网站上看到通过QQ截图,然后粘贴图片就可以在网站实现预览该截图的功能,这么便捷的操作是不是非常利于用户的体验呢. 下面通过JQUERY进行实现这一个功能,并且实现上传该图片到后端服务器.主要利用的是HTML5的clipboardData及FileReader,目前支持chrome及safari浏览器. 1.粘贴事件绑定 首先进行绑定paste事件,触发paste事件时获取到剪贴板的内容 然后对内容进行过滤出文件为图片类型的内容,通过FileReader生成dataurl文件资源,将

C# WinForm实现粘贴图片到PictureBox及复制PictureBox中的图片

本程序功能需要 PastePicture.dll 文件的支持,下载地址为:http://download.csdn.net/detail/jsjyyjs07/8907405 1.程序设计界面如下图: 操作方式为:按住快捷键Ctrl+V,鼠标点击一个PictureBox 完成图片的粘贴 按住快捷键Ctrl+C,鼠标点击一个PictureBox完成图片的复制 2.主要功能性代码如下: using PastePicture; ClipboardImage cImg = new ClipboardIma

百度ueditor 拖文件或world 里面复制粘贴图片到编辑中 上传到第三方问题

我这边从world 里面复制粘贴图片到编辑器中,它自动给我上传了,但是我是用的第三方的要设置一个token值,我找了很久,也没有找到应该在哪里设置这个上传的参数,如果是点击图片上传,我知道在dialogs\image\image.html中设置, 这个是在github上面提的问题,结果没有回答,自己读了一下源码,很山寨的解决了,忘别吐槽 function qiniutoken(name){ var token = ""; var jqxhr = $.ajax({ async : fal

js实现ctrl+v粘贴图片或是截图

浏览器环境:谷歌浏览器 1.ctrl+v粘贴图片都是监听paste时间实现的,复制的数据都存在clipboardData下面,虽然打印显示数据长度为0,但是还是可以获取数据的 2.打印clipboardData.items发现是一个DataTransferItem. 3.DataTransferItem有个getAsFile()的方法,可以获取文件 document.addEventListener('paste', function (event) { console.log(event);

Ckeditor 中粘贴图片

我们在ckeditor 中有上传图片,但是实际使用中这种手动上传图片方式并不是很方便,而是复制或者截图粘贴图片. 这里我们实现主要是获取对应的粘贴事件. CKEDITOR.instances["editor1"].on('instanceReady', function(e) { this.document.on("paste", function(e) { var items = e.data.$.clipboardData.items; for(var i =

KindEditor4.1.10,支持粘贴图片

转载自https://blog.csdn.net/jimmy0021/article/details/73251406 我已经忘记我是不是从这个博主的那里找到的解决kindeditor粘贴图片的方法了,因为上次处理这个问题已经快半年了.以下是正文 KindEditor4.1.10,使得他能够在Chrome和IE11中直接粘贴复制的图片(比如通过截图工具把图片直接保存在剪切板中),然后调用上传URL上传图片 方法,修改kindeditor.js中的代码: 在5825行附近大概是下面这个样子的: 1

div中粘贴图片并上传服务器 div中拖拽图片文件并上传服务器

应用简介:此文主要是描述如何在前端div中直接ctrl+v 粘贴图片,并上传到服务器,包括拖拽图片文件到div中 应用场景描述:用QQ或者其它切图软件截图,在指定的div中ctrl+v 粘贴并显示,点击上传按钮,图片上传到服务器.类似实现了此功能的网站有 知乎,强力建议博客园实现此功能,                     写博客时插入图片方便的多. 适用环境:本代码目前适用谷歌浏览器,其它浏览器需要稍微改良一下即可,问题不大. 开发环境:vs2015 mvc 不说废话了,开始吧: 1:首先

pasteimg浏览器中粘贴图片jQuery插件

pasteimg是一款可以在浏览器中实现图片粘贴的jQuery插件,兼容Chrome.Firefox.IE11以及其他使用这些内核的浏览器,比如,国内著名的360浏览器. pasteimg可以识别浏览器中直接复制的图片,也可以识别复制的富文本中的图片.仅仅可以识别在浏览器中复制的内容,操作系统中复制的图片是不能识别的. pasteimg依赖jQuery,简单易用,引入jQuery和paste.image.js后,调用方式如下: 1 //在需要监听粘贴事件的dom元素上调用pasteImage方法

Fckeditor实现WORD粘贴图片自动上传

在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper. 通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法. 其原理为一下步骤: 监听粘贴事件:[用于插入图片] 获取光标位置:[记录图片插入位置] 获取剪切板内容:[主要是获取文件] 上传剪切板图片: 在指定光标位置插入图片. 以下是代码部分: 1.获取光标代码部分,大部分都是直接利用TheViper的代码,只是做了简单的修改,在获取光标