в моем приложении для реагирования у меня есть iframe, который загружается с HTML-документом, и его содержание превышает 1 страницу. при нажатии Ctrl+p я хочу распечатать его на нескольких страницах, но предварительный просмотр показывает только одну страницу.
как это должно быть обработано, чтобы распознать, что содержание iframe составляет более одной страницы формата A4?
DOM в chrome devtool выглядит так
<div class = "article-container">
<iframe style = "">#document
/* hundreds of <p> tags */
</iframe>
</div>
структура в реагирующем приложении похожа на
<div className = "article-container">
<FrameText content = {content} status = {!this.state.editStatus} />
</div>
и фреймтекст
class FrameText extends React.Component<Props> {
iframe: HTMLIFrameElement;
compinentDidMount(){
window.addEventListener('beforeprint',(e)=>{console.info(e);})
}
/* other stuff*/
render() {
const { status } = this.props;
return <iframe ref = {(ref) => (this.iframe = ref!)} style = {!status ? { display: 'none' } : {}} />;
}
поэтому здесь, когда нажимается ctrl+p, я получаю событие, и документ iframe находится в событии. Кроме того, у меня есть содержимое iframe в локальном состоянии.
Я нигде не мог найти, что когда это событие запускается, что я могу с ним сделать, чтобы манипулировать или как-то сообщить предварительному просмотру печати, что содержимое длинное.
Кроме того, css
@media print {
.article-container {
background-color: white;
height: 100%;
width: 100%;
position: fixed;
top: 0;
left: 0;
margin: 0;
padding: 15px;
font-size: 14px;
line-height: 18px;
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш запрос печатного носителя не будет работать с внутренним содержимым iframe, поэтому размер iframe игнорируется при печати. Если вы хотите применить определенные стили печати к iframe, вам нужно ссылаться извне с помощью соответствующего метода (будь то js или html). Я пишу образец для ссылки стилей на iframe, могут существовать другие реализации для этого
let cssLink = document.createElement("link");
cssLink.href = "style.css";
cssLink.rel = "stylesheet";
cssLink.type = "text/css";
frames['iframe1'].document.head.appendChild(cssLink);
Привет, и спасибо за подсказку, но каким должно быть содержимое этого пользовательского js или css, которое показывает высоту/длину содержимого?
Создайте файл css только с одним классом @media print { iframe { height: 100%; ширина: 100%; положение: фиксированное; сверху: 0; слева: 0; маржа: 0; отступ: 15 пикселей; размер шрифта: 14px; высота строки: 18px; } }
не совсем, если вы видите класс, он находится в теге iframe, а не в охватывающем div
Я смог напечатать несколько страниц в iframe, перехватив событие CTRL P, передав фокус iframe, а затем инициировав печать в iframe.
<iframe id = "iframe" name = "iframe" src = "2.html"></iframe>
<script src = "https://code.jquery.com/jquery.min.js"></script>
<script>
$(document).bind("keyup keydown", function (e) {
if (e.ctrlKey && e.keyCode === 80) {
window.frames["iframe"].focus();
window.frames["iframe"].print();
return false;
}
return true;
});
</script>
Я пробовал это и все равно, конечно, без JQuery. Я не хочу использовать JQuery из-за только одной функции
@Amir-Mousavi Амир-Мусави, вы хотя бы пробовали это с JQuery, только для того, чтобы хотя бы посмотреть, работает ли концепция? Я попробовал это с 4-страничным iframe, и он правильно распечатал (в PDF).
нет, на самом деле то же самое можно применить, например, componentDidMount с добавлением списка событий для es6 onBeforePrint(), но поскольку я добавил других слушателей в iframe, таких как загрузка, отмена или печать, когда окно предварительного просмотра печати закрывается, эти листнеры возвращают значение null и приложение ломка поэтому я не думаю, что даже JQuery мне поможет. кроме того, это решение менеджера проекта, добавлять новую библиотеку или нет :)
Несколько грязный хак, но, возможно, достаточный: если вы знаете примерное количество страниц, вы можете оценить, насколько высоким должен быть iFrame в пикселях, и установить его в print-css, например, 4000px или что-то в этом роде.