DataTransferItemList.add
позволяет переопределить операцию копирования в javascript. Он, однако, принимает только объект File
.
Копировать событие
Код в моем copy
событии:
var items = (event.clipboardData || event.originalEvent.clipboardData);
var files = items.items || items.files;
if(files) {
var blob = Blob.fromDataURL(_this.editor.selection.getSelectedImage().toDataURL("image/png"));
files.add(blob);
}
Ошибка в хроме:
Uncaught TypeError: Не удалось выполнить
add
onDataTransferItemList
: параметр 1 не имеет типFile
.
Попытка new File(Blob blob, DOMString name)
В Google Chrome я пробовал это, в соответствии с текущей спецификацией:
var blob = Blob.fromDataURL(_this.editor.selection.getSelectedImage().toDataURL("image/png"));
var file = new File(blob, "image.png");
Проблема заключается в том, что Google Chrome не придерживается спецификаций.
Uncaught TypeError: Не удалось создать
File
: Незаконный конструктор
В этом случае Firefox также не работает:
Параметр метода отсутствует или недействителен.
Попытка new File([Mixed blobParts], DOMString name, BlobPropertyBag options)
Решение, предлагаемое @apsillers, также не работает. Это нестандартный метод, используемый (но бесполезный) как в Firefox, так и Chrome.
Двоичные данные
Я попытался избежать blob, но конструктор файлов все равно потерпел неудачу:
//Canvas to binary
var data = atob( //atob (array to binary) converts base64 string to binary string
_this.editor.selection.getSelectedImage() //Canvas
.toDataURL("image/png") //Base64 URI
.split(',')[1] //Base64 code
);
var file = new File([data], "image.png", {type:"image/png"}); //ERROR
Вы можете попробовать это в консоли:
Chrome < 38: Chrome >= 38:
Firefox:
Blob
Передача Blob
, вероятно, правильная и работает в Firefox:
var file = new File([new Blob()], "image.png", {type:"image/png"});
Firefox:
Chrome < 38:
Chrome >= 38:
- Q:. Как я могу сделать
File
изBlob
?
Примечание. Я добавил больше скриншотов после того, как @apsillers напомнили мне об обновлении Google Chrome.