从剪贴板Firefox获取粘贴的图像
Get Pasted Image from Clipboard Firefox
我正在尝试允许用户将图像粘贴到div
中。问题是我需要它在Firefox中运行。
据我所知,Firefox从13版开始(我认为(就不允许JavaScript访问剪贴板,event.clipboard
也不存在于其中。我知道这是可以做到的,因为Gmail和雅虎甚至在Firefox中也允许这样做。
我只想让它在任何可能的地方工作,与jQuery、JavaScript、HTML5一起工作,只要它在最新的Firefox中工作就没关系。(不过没有Flash(。
我使用了这个问题中的代码来实现跨浏览器粘贴。。它适用于我测试过的所有浏览器(向下滚动查看实际的解决方案/代码(。应当注意,event.clipboardData
在粘贴事件已经完成执行之后立即到期。
我继续仔细检查了一下,这在Firefox版本19中是否有效(我没有13个可用的,但听起来这个问题是关于新版本中某个功能的降级(。
以下是引用自Nico Burns
的答案:
解决方案
在IE6+、FF 3.5+、Opera、Chrome、Safari的最新ish版本中进行了测试。
function handlepaste (elem, e) {
var savedcontent = elem.innerHTML;
if (e && e.clipboardData && e.clipboardData.getData) {// Webkit - get data from clipboard, put into editdiv, cleanup, then cancel event
if (/text'/html/.test(e.clipboardData.types)) {
elem.innerHTML = e.clipboardData.getData('text/html');
}
else if (/text'/plain/.test(e.clipboardData.types)) {
elem.innerHTML = e.clipboardData.getData('text/plain');
}
else {
elem.innerHTML = "";
}
waitforpastedata(elem, savedcontent);
if (e.preventDefault) {
e.stopPropagation();
e.preventDefault();
}
return false;
}
else {// Everything else - empty editdiv and allow browser to paste content into it, then cleanup
elem.innerHTML = "";
waitforpastedata(elem, savedcontent);
return true;
}
}
function waitforpastedata (elem, savedcontent) {
if (elem.childNodes && elem.childNodes.length > 0) {
processpaste(elem, savedcontent);
}
else {
that = {
e: elem,
s: savedcontent
}
that.callself = function () {
waitforpastedata(that.e, that.s)
}
setTimeout(that.callself,20);
}
}
function processpaste (elem, savedcontent) {
pasteddata = elem.innerHTML;
//^^Alternatively loop through dom (elem.childNodes or elem.getElementsByTagName) here
elem.innerHTML = savedcontent;
// Do whatever with gathered data;
alert(pasteddata);
}
<div id='div' contenteditable='true' onpaste='handlepaste(this, event)'>Paste</div>
解释
onpaste
事件附加了handlepaste
函数,并传递了两个参数:this
(即对事件所附加的元素的引用(和event
(即事件对象(。
handlepaste
功能:
第一行只是将可编辑div的内容保存到一个变量中,以便在最后再次恢复。
if
检查浏览器是否为webkit浏览器(chrome或safari(,如果是,则将可编辑div的内容设置为要粘贴的数据。然后它会取消该事件,以防止webkit粘贴任何内容两次。这是因为webkit很尴尬,如果你简单地清除div,它就不会粘贴任何东西
如果它不是一个webkit浏览器,那么它只需清除可编辑的div.
然后调用waitforpastedata
函数
waitforpastedata
功能:
这是必要的,因为粘贴的数据不会直接出现,所以如果您直接调用processpaste
,那么它就没有任何数据要处理。
它所做的是检查可编辑div是否有任何内容,如果有,则调用processpaste
,否则它会设置一个计时器来调用自己,并在20毫秒后再次检查。
processpaste
功能:
该函数将可编辑div的innerHTML(现在是粘贴的数据(保存到一个变量中,将可编辑divinnerHTML恢复到其原始值,并提醒粘贴的数据。显然,在真实的使用场景中,您可能想要的不仅仅是警报数据,您可以从这里对它做任何您喜欢的事情。
您可能还希望通过某种数据清理过程来运行粘贴的数据。这可以在它仍在可编辑div中时完成,也可以在提取的字符串上完成。
在实际情况下,您可能希望之前保存所选内容,然后恢复(将光标位置设置为可编辑<div>(。然后,您可以在用户启动粘贴操作时光标所在的位置插入粘贴的数据。
p.S.此代码的组合,IE<=8和jsfiddle似乎不起作用,但它在ie<=中起作用8在非jsfiddle环境中。
- 获取ajax加载的图像的大小
- 点击(右键点击)使用传单地图库获取图像覆盖的像素坐标
- 如何使用javascript和xpath获取图像src
- 如何使用javascript从文件夹中获取图像并发布直接链接
- 如何使用Pixijs获取在加载的精灵表资产中定义的图像
- 如何从 javascript 中可能具有一个或多个图像的字符串中仅获取图像名称
- 获取图像节点js的主色
- 获取图像的平均外部像素颜色
- 使用asp.net FileUpload时从javascript获取图像宽度和高度
- 如何获取显示在谷歌搜索右侧的图像链接
- CodeIgniter:用于获取包括图像在内的值的控制器
- jQuery:获取图像加载错误的详细信息
- 如何使用php和javascript获取网页中显示图像的路径
- 使用回调获取图像像素数据
- 使用JavaScript从外部图像获取颜色
- 将完整路径图像获取到输入文件中
- 如何利用织物画布上的背景图像获取绘图路径中的图像
- 无法将图像加载到画布中并为该图像获取base64编码
- Android从内部图像获取ImageData()-SECURITY_ERR:DOM异常18
- 将html转换为图像(获取dom的快照)