男胖友de部落格

JS剪贴板相关

· nanpangyou

JS 剪贴板相关的内容

这两天做了一个需求,是通过 js 获取剪贴板中的字符串,对用户复制不同长度的字符串进行分类处理。

由于自己之前从来都没有关注过复制事件 paste ,于是就去网上找了找相关的资料,记录如下:

JS 是可以拿到用户所输入的内容的

paste 事件不一定需要绑定在 input 元素中,可以绑定在任意元素中,当用户鼠标在该元素上或者该元素处于 focus 状态,绑定的 paste 事件就会在复制的时候执行。

事件对象

        if (window.clipboardData && window.clipboardData.getData) {
          // IE
          pastedText = window.clipboardData.getData("Text");
        } else {
          //e.clipboardData.getData('text/plain');
          pastedText = e.originalEvent.clipboardData.getData("Text");
        }

粘贴事件为你提供了一个 clipboardData 对象, 它实际上是一个 DataTransfer 类型的对象, DataTransfer 是拖动产生的一个对象,但实际上粘贴事件也是它。

clipboardData 属性介绍

属性类型说明
dropEffectString默认是 none
effectAllowedString默认是 uninitialized
filesFileList粘贴操作为空 List
itemsDataTransferItemList剪切板中的各项数据
typesArray剪切板中的数据类型 该属性在 Safari 下比较混乱

items 介绍

items 是一个 DataTransferItemList 对象,自然里面都是 DataTransferItem 类型的数据了。

属性

itemsDataTransferItem 有两个属性 kindtype

属性说明
kind一般为 string 或者 file
type具体的数据类型,例如具体是哪种类型字符串或者哪种类型的文件,即 MIME-Type

方法

方法参数说明
getAsFile如果 kind 是 file,可以用该方法获取到文件
getAsString回调函数如果 kind 是 string,可以用该方法获取到字符串,字符串需要用回调函数得到,回调函数的第一个参数就是剪切板中的字符串

在原型上还有一些其他方法,不过在处理剪切板操作的时候一般用不到了。

types 介绍 一般 types 中常见的值有 text/plaintext/htmlFiles

说明
text/plain普通字符串
text/html带有样式的 html
Files文件(例如剪切板中的数据)

一个 Demo

pasteEle.addEventListener("paste", function (e){
    if ( !(e.clipboardData && e.clipboardData.items) ) {
        return ;
    }

    for (var i = 0, len = e.clipboardData.items.length; i < len; i++) {
        var item = e.clipboardData.items[i];

        if (item.kind === "string") {
            item.getAsString(function (str) {
                console.log(str)
                // str 是获取到的字符串
            })
        } else if (item.kind === "file") {
            var pasteFile = item.getAsFile();
            console.log(pasteFile)
            // pasteFile就是获取到的文件
        }
    }
});

注意如果是 string 类型的数据,可能针对具体是 text/plaintext/html 进行分别的处理。