可编辑的div黏贴图片
黏贴图片主要分为2个情况,第一个是直接截图或者打开图片后点击复制,第二个是直接使用ctrl+c复制电脑本地图片,今天主要是写一下ctrl+c复制电脑本地图片的方法
通过使用ctrl+c复制电脑本地图片 在粘贴板里面是保存的file文件类型 所以直接ctrl+v 是无法复制出来,这就需要我们将file类型的img 转化成blob类型,具体方法如下。将此函数绑定到 onPaste 黏贴事件
const getItem = async (event) => {
let items = event.clipboardData && event.clipboardData.items;
let file = null;
const selection = window.getSelection();
let paste = (event.clipboardData || window.clipboardData).getData('text');
selection.deleteFromDocument();
if (items && items.length) {
let filterItem = items;
// 检索剪切板items
for (let i = 0; i < filterItem.length; i++) {
if (filterItem[i].type.indexOf('image') !== -1) {
file = filterItem[i].getAsFile();
let blob = new Blob([file], { type: 'image/png' || 'application/*' });
document.execCommand('insertImage', 'false', URL.createObjectURL(blob));
} else {
if (filterItem[i].type.indexOf('text/html') !== -1) {
document.execCommand('insertText', 'false', paste);
}
}
}
}
};
第二个方法使用 window.getSelection.此方法是标准中推荐的方法
//获取当前黏贴dom 内容
const getItem = async (event) => {
let items = event.clipboardData && event.clipboardData.items;
let file = null;
const selection = window.getSelection();
let paste = (event.clipboardData || window.clipboardData).getData('text');
selection.deleteFromDocument();
if (items && items.length) {
let filterItem = items;
// 检索剪切板items
for (let i = 0; i < filterItem.length; i++) {
if (filterItem[i].type.indexOf('image') !== -1) {
file = filterItem[i].getAsFile();
let blob = new Blob([file], { type: 'image/png' || 'application/*' });
let fragment = selection.getRangeAt(0).createContextualFragment(`<img src=${URL.createObjectURL(blob)} />`);
selection.getRangeAt(0).insertNode(fragment.lastChild);
} else {
if (filterItem[i].type.indexOf('text/html') !== -1) {
selection.getRangeAt(0).insertNode(document.createTextNode(paste));
}
}
}
}
};