Javascript Mozilla 中的剪贴板 SetData 错误
Javascript Clipboard SetData Error in Mozilla
我想以编程方式复制图像。我使用了 executeCommand('copy')
,但它不起作用,所以我通过 document.addEventListener('copy', modifyCopy);
覆盖复制侦听器 在 modifyCopy 函数中,我将 base64 编码的字符串转换为 blob url 并通过 e.clipboardData.setData('image/png',blobUrl);
将其设置到剪贴板中chrome 它不起作用,但在 Mozilla 中,当我去绘画时设置数据后启用绘画粘贴但出现以下错误。
你可以查看 fiddle 我试过的内容。
http://jsfiddle.net/32mbd1o0/16/
function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const modifyCopy = e => {
var contentType = 'image/png';
var b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
var blob = b64toBlob(b64Data, contentType);
var blobUrl = URL.createObjectURL(blob);
alert(blobUrl);
e.clipboardData.setData('image/png',blobUrl);
e.preventDefault();
};
document.addEventListener('copy', modifyCopy);
$(".copyable").click(function (e) {
$(this).attr("contenteditable", true);
document.execCommand('copy');
});
Firefox 在复制和剪切事件期间仅支持这些数据类型Source。
- text/plain
- text/uri-list
- text/csv
- text/html
- image/svg+xml
- application/xml、text/xml
- application/json
一种可能的解决方法 described here,将图像作为 html 数据复制到剪贴板。这有效,但前提是您要粘贴到 Microsoft Windows Word 或其他文字处理器等程序上。处理图形(绘画、photoshop 等)的程序不理解剪贴板上的内容。
最后,您还可以为依赖于 API clipboard.setImageData() 的 firefox 创建一个扩展。 clipboard.setImageData 允许您使用图像数据填充剪贴板。此 API 与 Chrome 应用程序 API 兼容(它是在 Firefox 57 中添加的)并且它仍应被视为实验性的。此 API 需要 clipboardWrite 权限。
非常抱歉,但是 JavaScript
语言不可能像你想的那样做,请在 C#
:
中输入下面的代码
// Copy the selected area to the clipboard.
private void CopyToClipboard(Rectangle src_rect)
{
// Make a bitmap for the selected area's image.
Bitmap bm = new Bitmap(src_rect.Width, src_rect.Height);
// Copy the selected area into the bitmap.
using (Graphics gr = Graphics.FromImage(bm))
{
Rectangle dest_rect =
new Rectangle(0, 0, src_rect.Width, src_rect.Height);
gr.DrawImage(OriginalImage, dest_rect, src_rect, GraphicsUnit.Pixel);
}
// Copy the selection image to the clipboard.
Clipboard.SetImage(bm);
}
一些函数和 APIs 还没有在 JavaScript
中退出,因为一些安全和政策原因,比如 Clipboard.SetImage
,这个代码中的图像带有 Bitmap
函数被创建并放入剪贴板,然后像 Paint、Microsoft Office、Adobe productions 这样的应用程序可以找到它,但是 JavaScript
没有 API 或类似上面代码的函数。
我花了大约一个小时的时间来回答你,我有一个想法,我想将图像更改为 base64
然后复制到剪贴板,但这不是一个好主意,因为它是文本,纯文本和其他应用程序只能看到文本,我知道这很糟糕,但确实如此。
前段时间我用Windows10snipping tool
和Linuxshutter
截取部分桌面,然后用Telegram发给我朋友,我看到一个简单的 Ctrl+V 我可以将裁剪的部分粘贴到聊天区域,裁剪的部分自动复制到我的剪贴板中,我搜索了关于它但不像现在这样,我深入搜索它并发现它,无法在浏览器区域之外复制剪贴板中的图像。
只有一种方法可以只为浏览器复制,将图像转换为 base64
并将其保存在剪贴板中,然后只需在浏览器中将其作为 img
标签并设置 base64
文本作为 src
属性添加到 img
标签。就是这样。
抱歉有个坏消息。
我想以编程方式复制图像。我使用了 executeCommand('copy')
,但它不起作用,所以我通过 document.addEventListener('copy', modifyCopy);
覆盖复制侦听器 在 modifyCopy 函数中,我将 base64 编码的字符串转换为 blob url 并通过 e.clipboardData.setData('image/png',blobUrl);
将其设置到剪贴板中chrome 它不起作用,但在 Mozilla 中,当我去绘画时设置数据后启用绘画粘贴但出现以下错误。
你可以查看 fiddle 我试过的内容。 http://jsfiddle.net/32mbd1o0/16/
function b64toBlob(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
const modifyCopy = e => {
var contentType = 'image/png';
var b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';
var blob = b64toBlob(b64Data, contentType);
var blobUrl = URL.createObjectURL(blob);
alert(blobUrl);
e.clipboardData.setData('image/png',blobUrl);
e.preventDefault();
};
document.addEventListener('copy', modifyCopy);
$(".copyable").click(function (e) {
$(this).attr("contenteditable", true);
document.execCommand('copy');
});
Firefox 在复制和剪切事件期间仅支持这些数据类型Source。
- text/plain
- text/uri-list
- text/csv
- text/html
- image/svg+xml
- application/xml、text/xml
- application/json
一种可能的解决方法 described here,将图像作为 html 数据复制到剪贴板。这有效,但前提是您要粘贴到 Microsoft Windows Word 或其他文字处理器等程序上。处理图形(绘画、photoshop 等)的程序不理解剪贴板上的内容。
最后,您还可以为依赖于 API clipboard.setImageData() 的 firefox 创建一个扩展。 clipboard.setImageData 允许您使用图像数据填充剪贴板。此 API 与 Chrome 应用程序 API 兼容(它是在 Firefox 57 中添加的)并且它仍应被视为实验性的。此 API 需要 clipboardWrite 权限。
非常抱歉,但是 JavaScript
语言不可能像你想的那样做,请在 C#
:
// Copy the selected area to the clipboard.
private void CopyToClipboard(Rectangle src_rect)
{
// Make a bitmap for the selected area's image.
Bitmap bm = new Bitmap(src_rect.Width, src_rect.Height);
// Copy the selected area into the bitmap.
using (Graphics gr = Graphics.FromImage(bm))
{
Rectangle dest_rect =
new Rectangle(0, 0, src_rect.Width, src_rect.Height);
gr.DrawImage(OriginalImage, dest_rect, src_rect, GraphicsUnit.Pixel);
}
// Copy the selection image to the clipboard.
Clipboard.SetImage(bm);
}
一些函数和 APIs 还没有在 JavaScript
中退出,因为一些安全和政策原因,比如 Clipboard.SetImage
,这个代码中的图像带有 Bitmap
函数被创建并放入剪贴板,然后像 Paint、Microsoft Office、Adobe productions 这样的应用程序可以找到它,但是 JavaScript
没有 API 或类似上面代码的函数。
我花了大约一个小时的时间来回答你,我有一个想法,我想将图像更改为 base64
然后复制到剪贴板,但这不是一个好主意,因为它是文本,纯文本和其他应用程序只能看到文本,我知道这很糟糕,但确实如此。
前段时间我用Windows10snipping tool
和Linuxshutter
截取部分桌面,然后用Telegram发给我朋友,我看到一个简单的 Ctrl+V 我可以将裁剪的部分粘贴到聊天区域,裁剪的部分自动复制到我的剪贴板中,我搜索了关于它但不像现在这样,我深入搜索它并发现它,无法在浏览器区域之外复制剪贴板中的图像。
只有一种方法可以只为浏览器复制,将图像转换为 base64
并将其保存在剪贴板中,然后只需在浏览器中将其作为 img
标签并设置 base64
文本作为 src
属性添加到 img
标签。就是这样。
抱歉有个坏消息。