最近想了解一下canvas,索性仿个pc的画图功能。做到粘贴剪贴板图片功能时,问题来了。
此功能常见场景:聊天窗口复制图片。如,微信web版的聊天窗口,粘贴图片会读取到内容
一、先说问题原因
除ie,浏览器出于安全考虑,不会提供直接对剪贴板内容的读、写操作。同样安全考虑,监听到paste事件后,会返回粘贴内容,chrome虽有接口实现但是其内容为空,等于没实现。(操作看不懂了,难道仅为了防止报错么)
二、解决方案
原理:创建一个div并利用contenteditable属性使其可以容纳粘贴的内容,然后利用图片选择器将其取出。
第1步:创建读取剪贴板图片的容器
原理已经说明,直接上代码
const input= document.createElement('div');
input.setAttribute('contenteditable', "true");
input.classList.add('draw-readclipbrdImg');
input.addEventListener('keydown', (e) => {
e.preventDefault();
});
document.appendChild(input);
const readClipbrd = () => {
input.innerHTML='';
input.focus();
document.execCommand('paste');
}
const readImg = () => {
setTimeout(_ => {(resolve, reject) => {
const img = input.querySelector('img');
if (img) {
img.style = {};
resolve(img);
} else {
}
input.innerHTML = '';
}, 200);
};
document.addEventListener('paste', readImg);
第2步:监听粘贴事件,调用上面的readClipbrd 方法。
input直接用onkeydown。
document.addEventListener('keydown', e => {
readClipbrd();
});
本人遇到的场景是画布监听,onkeydown无效。键盘监听问题,移步前端杂症–div等容器keydown事件无效(包括vue的@keydown)。
三、注意
keydown监听有效,鼠标单击按钮调用读取方法不好使,也许是焦点问题,目前再寻找解决方案。
四、其他场景:富文本编辑器
虽未做兼容测试,但总体思路还是比较靠谱的。最近研究了一下富文本编辑器,基本也是利用dom的contenteditable属性实现的。另外,外层加上了iframe做隔离防止外部影响。
转载请注明原文地址:https://ipadbbs.8miu.com/read-45725.html