Подтвердить что ты не робот

Печать содержимого динамически созданного iframe из родительского окна

У меня есть страница со списком ссылок и div, которая служит заполнителем для страниц, к которым ведут ссылки. Каждый раз, когда пользователь нажимает на ссылку, iframe создается в div, а его атрибут src получает значение атрибута link href - простую и понятную галерею внешних веб-страниц. У меня проблема с печатью содержимого iframe. Для этого я использую этот код:

function PrintIframe()  
{  
frames["name"].focus();  
frames["name"].print();  
}

Проблема заключается в том, что iframe динамически создается JQuery - когда я вставляю iframe прямо в html-код, браузер правильно печатает внешнюю страницу. Но с тем же кодом, введенным JavaScript, ничего не происходит. Я попытался использовать JQ 1.3 "живое" событие на ссылке "Печать", без успеха. Есть ли способ преодолеть это?

4b9b3361

Ответ 1

Предположим, что это ваш iframe выглядит следующим образом:

<iframe id='print-iframe' name='print-frame-name'></iframe>

Вот как вы это делаете, используя jQuery:

$("#print-iframe").get(0).contentWindow.print();

и так вы это делаете, используя собственный JavaScript:

document.getElementById("print-iframe").contentWindow.print();

Ответ 2

У меня возникла проблема с печатью содержимого iframe. Чтобы добиться этого, используйте следующий код:

Например, у вас есть iframe:

<iframe id='print-iframe' name='print-iframe'></iframe>

Затем js для печати содержимого iframe вызывает эту функцию (работает как в ie, так и в других браузерах):

printIframe('print-iframe');

Код функции:

function printIframe(iFrameId) {
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf ("MSIE ");
    var iframe = document.getElementById(printFrameId);

    if (msie !== 0) {
        iframe.contentWindow.document.execCommand('print', false, null);
    } else {
        iframe.contentWindow.print();
    }
}

Ответ 3

Я попробовал это и смог воспроизвести проблему. Я заметил, что при вызове функции печати iframe не завершил загрузку. Я проверил это, проверив значение innerHTML при вызове PrintIFrame(). Чтобы преодолеть это, вы можете использовать setTimeOut для вызова функции снова через миллисекунды позже:

function PrintIframe() { 

        if (window.frames['myname'].innerHTML != "") {
            window.frames['myname'].focus();
            window.frames['myname'].print();
        } else {
            setTimeout(PrintIframe,1000);
        }    
    }

Это сработало для меня

ИЗМЕНИТЬ Странно - у меня было предупреждение в моем тестовом коде, который, похоже, заставляет его работать. Когда я понял, это не сработало. Извините: (

В любом случае, это должно сделать это, используя jQuery для присоединения обработчика события нагрузки к iframe. Я тестировал на IE8, и он работает:

<html>
<head>
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
    function loadiFrame(src)
    {
        $("#iframeplaceholder").html("<iframe id='myiframe' name='myname' src='" + src + "' />");
    }

    $(function()
    {
        $("#printbutton").bind("click", 
            function() { 
                loadiFrame('test.aspx'); 
                $("#myiframe").load( 
                    function() {
                        window.frames['myname'].focus();
                        window.frames['myname'].print();
                    }
                 );
            }
        );
    });
    </script>    
</head>
<body>
    <input type="button" id="printbutton" value="Load iFrame" />
    <div id="iframeplaceholder"></div>
</body>
</html>

Ответ 4

Хм, я прав? Вам нужно только изменить источник, на который ведет IFrame?

$("#iframe").attr("src", "http://www.example.com");

Ответ 5

Возможно, ограничение на один домен предотвратит выполнение JavaScript. Ограничение одного домена позволяет JavaScript в кадре A (или в главном окне) взаимодействовать (например,.print()) с кадром B, если A и B находятся из одного домена. Проверьте свою консоль ошибок JavaScript. Если вы получаете что-то вроде ошибки безопасности/разрешения безопасности, то, скорее всего, это связано с тем же ограничением.

Ответ 6

var ifrm = document.createElement("iframe");
// ifrm.style.display = "none";
document.body.appendChild(ifrm);
setTimeout(function() {
    $(ifrm).contents().find("body").html("my html content");
}, 1);
ifrm.onload = function() {
    ifrm.contentWindow.print();
}

Ответ 7

Я нашел этот поиск в Интернете

$('#preview-iframe').contents().find('html').html(data); 

и изменил его на

$('#preview-iframe').contents().find('html').html(data).after(function() {
    document.getElementById("preview-iframe").contentWindow.print();
});

twigstechtips

Ответ 8

Я знаю, что это довольно старый поток, но для этого у меня есть еще одно средство для борьбы с грязью.

Это основано на fooobar.com/info/289621/... и fooobar.com/info/289621/...

Я добавил функцию .one(), чтобы она не зависала бесконечно, если вы отменили печать! Я также загружаю iframe один раз. Наслаждайтесь

var $body = $("body"),
  $iframe,
  loadiFrame = function(src) {
    if ($body.children('#full-prog').length == 0) {
      $body.append("<iframe id='full-prog' src='" + src + "' />");
      $iframe = $("#full-prog");
      $iframe.one('load', function() {
        $iframe.get(0).contentWindow.print();
      });
    } else {
      $iframe.get(0).contentWindow.print();
    }
  };

$("#printbutton").click(function() {
  loadiFrame('iframe source here');
});
#full-prog {
  overflow: hidden;
  position: absolute;
  width: 0;
  height: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="button" id="printbutton" value="Load iFrame" />