Основная проблема действительно та же, что и описанная в 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