Я пишу PWA-версию приложения Ionic, где пользователь может сделать снимок и прикрепить его к электронному письму, созданному из приложения. Поскольку Chrome требует от вас перенаправить окно для создания электронного письма, и поскольку этот подход не поддерживает вложения, я подумал о том, чтобы скопировать изображение в буфер обмена, а затем попросить пользователя вставить его в электронное письмо. Мальчик, это оказалось сложным ...
Я использую метод document.execCommand ('copy') ", чтобы получить редактируемый контент, и у него нет проблем с захватом текста. Работает в браузере просто отлично, Chrome, Safari, даже Edge. Но когда я запускаю устройство на Android или iOS, изображение выглядит как небольшой пустой блок. Я использую немного кода из этого кода (и он работает даже на Android / iOS): https://codepen.io/chrisdavidmills/pen/gzYjag. Разница в том, что мое изображение не статично; он фиксируется пользователем с помощью его камеры, а затем я добавляю его в DOM.
Вот мой HTML:
<div id="containerToHoldImageForPWA" contenteditable="true"></div>
...
<a id="copyButton" href="#" (click)="selectEditableRegion()" style="float: right;" class="contenteditable-btn">
<ion-icon name="camera" aria-label="camera"></ion-icon>
</a>
<a id="copyButton" href="#" (click)="copySelectedRegion()" style="float: right;" class="contenteditable-btn">
<ion-icon name="camera" aria-label="camera"></ion-icon>
</a>
И мой Javascript (машинопись):
processFile(fileEvent) {
let _selectedFile = <File>fileEvent.target.files[0];
if (_selectedFile.type.match(/image.*/)) {
const reader = new FileReader();
reader.onload = () => {
let image = new Image();
image.onload = () => {
// Resize the image
let canvas = document.createElement('canvas');
let max_size = 640;
let width = image.width;
let height = image.height;
if (width > height) {
if (width > max_size) {
height *= max_size / width;
width = max_size;
}
} else {
if (height > max_size) {
width *= max_size / height;
height = max_size;
}
}
canvas.width = width;
canvas.height = height;
canvas.getContext('2d').drawImage(image, 0, 0, width, height);
let dataUrl = canvas.toDataURL('image/jpeg');
let div = document.getElementById('containerToHoldImageForPWA');
let img = document.createElement('img');
img.id = 'tempimage';
img.alt = 'Your Photo';
img.src = dataUrl;
div.appendChild(img);
};
image.src = reader.result as string;
};
reader.readAsDataURL(_selectedFile);
}
}
selectEditableRegion() {
let div = document.getElementById('containerToHoldImageForPWA');
this.selectContents(div.children[0]);
// document.execCommand('selectAll');
}
copySelectedRegion() {
document.execCommand('copy');
}
selectContents(element) {
let selection = window.getSelection();
let range = document.createRange();
// range.selectNodeContents(element);
range.selectNode(element);
selection.removeAllRanges();
selection.addRange(range);
}
И немного CSS:
[contenteditable] {
-webkit-user-select: none; /* webkit (safari, chrome) browsers */
-moz-user-select: none; /* mozilla browsers */
-khtml-user-select: none; /* webkit (konqueror) browsers */
-ms-user-select: none; /* IE10+ */
user-select: none;
}
.contenteditable-btn {
-webkit-user-select: none; /* webkit (safari, chrome) browsers */
-moz-user-select: none; /* mozilla browsers */
-khtml-user-select: none; /* webkit (konqueror) browsers */
-ms-user-select: none; /* IE10+ */
user-select: none;
}
Когда я вставляю данные буфера обмена вместо изображения с текстом атрибута «alt» «Твое фото», я вижу разорванное изображение с текстом «твое фото» alt. Но, как я уже сказал, это прекрасно работает на Chrome или Safari на Windows / Mac соответственно.
Есть идеи?