javascript在网页中实现读取剪贴板粘贴截图功能


Posted in Javascript onJune 07, 2014

见某网站的输入框支持截屏粘贴的功能,觉得有点意思,于是将代码扒出来分享下。

可惜,目前仅有高版本的 Chrome 浏览器支持这样直接粘贴,其他浏览器目前为止还无法粘贴( IE11没测试过 ),当然这种增强型的用户体验功能有总比没有好。

输入框的结构代码:

<input type="text" id="testInput" />

为输入框绑定粘贴事件:

var input = document.getElementById( 'testInput' );
input.addEventListener( 'paste', function( event ){
    // dosomething...
});

粘贴事件的 Event 接口对象提供了一个 clipboardData 接口,该接口就保存了系统剪贴板中的数据,如上面所说,目前只有高版本的 Chrome 浏览器能直接访问系统剪贴板的数据。这就给截屏后保存到剪贴板中的图片于网页直接进行交互提供了一个入口。

这里所说的截屏,就是 QQ 提供的截屏或者系统自带的 PrtScn 键的截屏功能,或者其他第三方软件提供的截屏功能。

input.addEventListener( 'paste', function( event ){
    // 添加到事件对象中的访问系统剪贴板的接口
    var clipboardData = event.clipboardData,
        i = 0,
        items, item, types;    if( clipboardData ){
        items = clipboardData.items;
        if( !items ){
            return;
        }
        item = items[0];
        // 保存在剪贴板中的数据类型
        types = clipboardData.types || [];
        for( ; i < types.length; i++ ){
            if( types[i] === 'Files' ){
                item = items[i];
                break;
            }
        }
        // 判断是否为图片数据
        if( item && item.kind === 'file' && item.type.match(/^image\//i) ){
            // 读取该图片            
            imgReader( item );
        }
    }
});

从剪贴板中取到了图片数据,就可以用 FileReader 对其进行读取了。

var imgReader = function( item ){
    var file = item.getAsFile(),
        reader = new FileReader();    // 读取文件后将其显示在网页中
    reader.onload = function( e ){
        var img = new Image();
        img.src = e.target.result;
        document.body.appendChild( img );
    };

    // 读取文件
    reader.readAsDataURL( file );
};

很短的代码就实现了,可以使用以下源码看看演示。

<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<title>利用 clipboardData 在网页中实现截屏粘贴的功能</title>
<style type="text/css">
#box{ width:200px; height:200px; border:1px solid #ddd; }
</style>
</head>
<body>
<h1>利用 clipboardData 在网页中实现截屏粘贴的功能</h1>   
<hr />
<div><input type="text" id="testInput" placeholder="截屏后粘贴到输入框中" size="30" /></div>
<script type="text/javascript">
(function(){
    var imgReader = function( item ){
        var blob = item.getAsFile(),
            reader = new FileReader();
        reader.onload = function( e ){
            var img = new Image();
            img.src = e.target.result;
            document.body.appendChild( img );
        };
        reader.readAsDataURL( blob );
    };
    document.getElementById( 'testInput' ).addEventListener( 'paste', function( e ){
    var clipboardData = e.clipboardData,
        i = 0,
        items, item, types;
    if( clipboardData ){
        items = clipboardData.items;
        if( !items ){
            return;
        }
        item = items[0];
        types = clipboardData.types || [];
        for( ; i < types.length; i++ ){
            if( types[i] === 'Files' ){
                item = items[i];
                break;
            }
        }
        if( item && item.kind === 'file' && item.type.match(/^image\//i) ){
            imgReader( item );
        }
    }
    });
})();  
</script>
</body>
</html>
Javascript 相关文章推荐
JavaScript延迟加载
Mar 09 Javascript
js或css文件后面跟参数的原因说明
Jan 09 Javascript
使用jquery解析XML的方法
Sep 05 Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 Javascript
javascript实现的多个层切换效果通用函数实例
Jul 06 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
Jul 17 Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
Jan 18 Javascript
Vue2.0结合webuploader实现文件分片上传功能
Mar 09 Javascript
React 使用recharts实现散点地图的示例代码
Dec 07 Javascript
详解vue-cli3 中跨域解决方案
Apr 10 Javascript
JavaScript中的函数申明、函数表达式、箭头函数
Dec 06 Javascript
react中hook介绍以及使用教程
Dec 11 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 #Javascript
jQuery的缓存机制浅析
Jun 07 #Javascript
Firefox中使用outerHTML的2种解决方法
Jun 07 #Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
Jun 06 #Javascript
判断iframe里的页面是否加载完成
Jun 06 #Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 #Javascript
js中的hasOwnProperty和isPrototypeOf方法使用实例
Jun 06 #Javascript
You might like
php简单实现多字节字符串翻转的方法
2015/03/31 PHP
php观察者模式应用场景实例详解
2017/02/03 PHP
PHP如何读取由JavaScript设置的Cookie
2017/03/22 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
通过length属性判断jquery对象是否存在
2013/10/18 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
2014/01/11 Javascript
JQuery遍历元素的后代和同胞实现方法
2016/09/18 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
2016/11/07 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
深入了解JavaScript词法作用域
2020/07/29 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
Python中优化NumPy包使用性能的教程
2015/04/23 Python
python difflib模块示例讲解
2017/09/13 Python
Pandas:Series和DataFrame删除指定轴上数据的方法
2018/11/10 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
比利时网上药店: Drogisterij.net
2017/03/17 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
《盲人摸象》教学反思
2014/02/16 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
学生自我评语大全
2014/04/18 职场文书
安全生产承诺书范文
2014/05/22 职场文书
本科毕业生自荐信
2014/06/02 职场文书
2015教师年度思想工作总结
2015/04/30 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
快速学习Oracle触发器和游标
2021/06/30 Oracle