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

浏览器环境:谷歌浏览器

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();
                    }
                }
            }
        }
    })

此时就可以获取到blob对象了,这时候可以选择显示在页面上,也可以选择发送给后台

3.1显示图片

  3.1.1执行下面代码即可,使用blob对象显示

  var blobUrl=URL.createObjectURL(blob);
       document.getElementById("imgNode").src=blobUrl;

效果图

  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);

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);

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>
时间: 2024-08-04 18:56:42

js实现ctrl+v粘贴图片或是截图的相关文章

js实现ctrl+v粘贴并上传图片

再分享一个刚学会的小东东:聊天室实现ctrl+v粘贴并上传图片,亲测有效(目前只能粘贴QQ或者微信的截图上传,桌面上的图片直接复制再粘贴无效,今后再深究),下面上代码 前端页面: <textarea class="scroll" id="text" placeholder="在此输入..."></textarea> <script type="text/javascript"> docume

ckeditor 实现ctrl+v粘贴图片并上传、word粘贴带图片

由于工作需要必须将word文档内容粘贴到编辑器中使用 但发现word中的图片粘贴后变成了file:///xxxx.jpg这种内容,如果上传到服务器后其他人也访问不了,网上找了很多编辑器发现没有一个能直接解决这个问题 考虑到自己除了工作其他时间基本上不使用windows,因此打算使用nodejs来解决这一问题 发现不管什么编辑器只要将图片转换成base64后就可以直接使用(IE8及一下可能不支持),由于编辑器中添加word文档功能也只是自己用,因此可以忽略这种浏览器了 找了很久,试用了很多编辑器,

c# TextBox只允许输入数字,禁用右键粘贴,允许Ctrl+v粘贴数字

TextBox只允许输入数字,最大长度为10 //TextBox.ShortcutsEnabled为false 禁止右键和Ctrl+v private void txtNumber_KeyPress(object sender, KeyPressEventArgs e) { //只允许输入数字,粘贴数字 if (!(Char.IsNumber(e.KeyChar) || e.KeyChar == (char)8)) { e.Handled = true; } } //允许Ctrl+v粘贴数字 p

xhEditor实现ctrl+v粘贴word图片并上传

自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器)中时,编辑器都无法自动上传图片.需要用户手动一张张上传Word图片.如果只有一张图片还能够接受,如果图片数量比较多,这种操作就显得非常的麻烦. 1.只粘贴图片并上传到服务器 config.extraPlugins = 'uploadimage'; //config.uploadUrl = '上传路径

C# 控制台程序实现 Ctrl + V 粘贴功能

代码主要分为两部分,首先调用系统API注册剪切板相关的事件,然后监控用户的按键操作.完整代码如下: class ClipBoard { [DllImport("user32.dll", SetLastError = true)] private static extern Int32 IsClipboardFormatAvailable(uint format); [DllImport("user32.dll", SetLastError = true)] priv

KindEditor ctrl+v添加图片功能

原理: 监听粘贴事件(paste) 获取粘贴版数据,读取到图片数据流进行加载base64 传到后台服务端直接输出为图片文件保存后返回图片读取路径插入编辑器中 /** * 获取编辑器对象 */ window.$KindEditor = KindEditor.create('#submit_editor', { width : $("#submit_editor").width(), height: $("#submit_editor").height(), cssPa

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

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

Word图片粘贴上传控件,直接粘贴图片到编辑器-DEDE

很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个word 粘贴到 富文本编辑器里面 方法一: 工具/原料 百度doc任意富文本编辑器,以UEDdito为例 方法/步骤 登录,http://word.baidu.com 点击右上角 导入文档,如图所示 导入后,系统会自动将word的内容加载进去.此时 点击右上角编辑,Ctrl+A复制所有内容 打开UE

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

在很多富文本编辑器或者编辑框中添加图片,都是通过点击按钮-选择图片-上传的形式,这需要使用者先保存好图片. 在有些情况下,实现截图或复制图片后直接粘贴图片,让操作更简单. 例如,在textarea中粘贴图片,通过监听paste动作来获取粘贴板中的图片数据,并将图片上传到服务器上,获取图片的url后在指定的地方显示,一般是将图片插入textarea中光标所在的地方. 实现过程只需要一个js文件 var input = document.getElementsByTagName("textarea&