Как распечатать содержимое iframe, используя внешний URL-адрес изображения - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь печатать напрямую с URL-адреса, являющегося источником iframe

<iframe id="pagetwo" src="https://78.media.tumblr.com/b90ee054017d4ddd25a4c4161127c7d4/tumblr_p8iyzdMhuZ1qzooxpo1_1280.jpg" width="550" height="700"></iframe>

<a id="downloadlink2" class="link_print" href="" target="_blank"  onclick="printDocument('pagetwo')">
  <img src="assets/print-button.png" alt="">
</a>

При печати этого скрипта:

function printDocument(iframe) {
  console.log(window.frames);
  var iframe = document.getElementById(iframe);
  if (iframe.src) {
    var frm = iframe.contentWindow;
    frm.focus();// focus on contentWindow is needed on some versions  
    frm.print();
  }     
}

Я получаю эту ошибку:

Uncaught DOMException: заблокировал фрейм с началом координат "http://localhost:8080" от доступа к фрейму перекрестного происхождения.

Однако, когда я помещаю изображение в локальный файл, оноработает отлично

1 Ответ

0 голосов
/ 11 мая 2018

Основная проблема действительно та же, что и описанная в SecurityError: заблокирован фрейм с происхождением от доступа к фрейму перекрестного происхождения , но у вас есть особый вариант использования, который может требовать своего собственного ответа .

Поскольку вы загружаете эту рамку перекрестного происхождения только для того, чтобы напечатать изображение, на которое она указывает, вы можете создать документ, который будет отображать это изображение тем же способом, и вызвать print для этого кадр того же происхождения:

В обычных случаях вы можете просто создать BLOB-объект такого документа и отобразить его в рамке:

var frame = document.createElement('iframe');
var external_doc = new Blob(['<html><body><img src="https://78.media.tumblr.com/b90ee054017d4ddd25a4c4161127c7d4/tumblr_p8iyzdMhuZ1qzooxpo1_1280.jpg"></body></html>'], {
  type: 'text/html'
});
frame.onload = function() {
  try {
    this.contentWindow && this.contentWindow.print();
    return;
  } catch (e) {}
  console.error('in a protective iframe?');
};
frame.src = URL.createObjectURL(external_doc);
document.body.appendChild(frame);

Но поскольку сами StackSnippet запускаются в сверхзащитных фреймах, здесь это не сработает, но в jsfiddle .

Ps: Если вам нужно поддерживать старые браузеры, которые не поддерживали Blob API, вы также можете просто добавить <img> из about:blank iframe: jsfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...