2009-05-06 1 views
15

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

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

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

ответ

26

Предположим, что это то, что ваш IFrame выглядит :

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

Это, как вы делаете это с помощью JQuery:

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

и это, как вы делаете это U петь родной JavaScript:

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

+ 1 для 'contentWindow' –

0

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

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

нет, проблема в том, что я не могу напечатать страницу в IFRAME - там уже 2 варианта: 1), что можно печатать как часть страницы (с Плагин PrintArea), но затем он печатает только одну страницу, а содержимое страницы iframed не форматируется на бумаге, как должно быть. 2) его можно распечатать как обычную страницу, но ТОЛЬКО, если тег iframe не вставлен динамически, через JS, но статически представлен в HTML. – certainlyakey

0

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

+0

Нет, у меня таких ошибок нет в Firebug ... И да, все страницы из одного домена. – certainlyakey

7

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

function PrintIframe() { 

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

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

EDIT Странно - я имел предупреждение в моем тестовом коде, который, кажется, чтобы сделать он работает. Когда я понял, это не сработало. К сожалению :(

Во всяком случае, это должно сделать это с помощью 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> 
+0

Не для меня :(Опять же, все в порядке с html, но он не печатает iframe, если он был создан самим JQ. – certainlyakey

+0

Хорошо, что ваша последняя разработка работала для меня на тестовой странице, следует еще раз изучить ... – certainlyakey

0
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(); 
} 
0

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

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

и изменил его

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

twigstechtips

8

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

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

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

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

printIframe('print-iframe'); 
код

Function в:

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(); 
    } 
} 
+0

Это, кажется, работает нормально. Однако я думаю, что лучше проверить (msie> -1). –

+0

Это простая проверка только :) Источник: http://support.microsoft.com/ kb/167820 –

+0

Работает только один раз. Если я снова нажму кнопку, я получу «Ошибка выполнения JavaScript: доступ запрещен». Я пытаюсь тихо распечатать документ в формате PDF. У меня есть таблица с несколькими записями, и каждая запись может быть «напечатана». Когда нажата кнопка печати записи, src iframe обновляется с новым URL-адресом, и приведенный выше код выполняется, чтобы его распечатать. Как я уже сказал, он работает один раз, но последующие клики, он терпит неудачу с вышеупомянутой ошибкой javascript. – Paul

0

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

Он основан на https://stackoverflow.com/a/9648159/3183069 и https://stackoverflow.com/a/831547/3183069

Я добавил .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" />

 Смежные вопросы

  • Нет связанных вопросов^_^