另一个JavaScript“将图像复制到剪贴板”问题

时间:2019-04-04 04:24:20

标签: javascript ionic-framework clipboard progressive-web-apps

我正在编写Ionic应用程序的PWA版本,用户可以在其中拍照,并将其附加到该应用程序生成的电子邮件中。由于Chrome浏览器要求您重定向窗口以创建电子邮件,并且由于该方法不支持附件,因此我想将图像复制到剪贴板,然后让用户将其粘贴到电子邮件中。男孩被证明具有挑战性...

我正在使用“ document.execCommand('copy')”方法获取可编辑的内容,并且捕获文本没有问题。它可以在浏览器,Chrome,Safari,甚至Edge中正常运行。但是,当我在Android或iOS设备上运行时,图像会变成一个小的空白块。我正在使用此Codepen中的一些代码(甚至在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”文本“ Your Photo”的损坏图像,而不是带有“ alt”属性文本“ Your Photo”的图像。但是就像我说的那样,这分别在Windows或Mac上的Chrome或Safari上可以正常使用。

有什么想法吗?

0 个答案:

没有答案