Page 1 of 1

Gibt es eine Möglichkeit, beforePrint zu verzögern, damit eine PostMessage abgeschlossen werden kann?

Posted: 20 Jan 2025, 13:31
by Guest
Problem
Mein Problem ist, dass nach dem Drücken von STRG + P oder Datei -> Drucken die Daten aus dem Iframe nicht zum Drucken in das obere Fenster kopiert wurden.
Wenn das beforeprint-Ereignis ausgelöst wird, wird die Funktion „_beforePrinting“ aufgerufen, und wenn das aktuelle Fenster nicht das oberste Fenster ist, wird eine window.top.postMessage mit den Daten gesendet. Beim Empfang der Nachricht wird eine Funktion „_handleBeforePrint“ aufgerufen, der die Daten übergeben werden. Diese Funktion verwaltet das Verschieben von Daten vom Iframe in das obere Fenster zum Drucken.
Zusätzliche Informationen
Diese Methode zum Erfassen von Informationen und zum Drucken wurde durchgeführt Vermeiden Sie einen domänenübergreifenden Fehler.
Code
beforePrinting-Funktion:

Code: Select all

function _beforePrinting() {
let isPrintIframe = document.getElementById(PRINT_IFRAME_ID);
if (isPrintIframe) {
return;
}
let pageContent = document.getElementsByClassName(CSS_TEMPLATE)[0],
pageHeader = document.getElementById(PRINT_HEADER_TEMPLATE_ID);

if (pageContent) {
if (window !== window.top) {
window.top.postMessage({ type: MESSAGE_BEFORE_PRINT, pageHeader: pageHeader.innerHTML, pageContent: pageContent.innerHTML }, window.popupProperties.topMostTargetOrigin);
}
} else {
_handleBeforePrint(true, pageContent.cloneNode(true),
pageHeader.content.cloneNode(true));
}
}
Nachrichtenereignis-Listener, der handleBeforePrint() aufruft:

Code: Select all

else if (event.data.type === MESSAGE_BEFORE_PRINT || event.data.type === MESSAGE_PRINTING_ACTION) {
if (window === window.top) {
_handleBeforePrint(false, event.data.pageContent, event.data.pageHeader);

if (event.data.type === MESSAGE_PRINTING_ACTION) {
window.print();
}
}
}
handleBeforePrint()-Funktion, die das Verschieben von Daten vom Iframe in das obere Fenster zum Drucken verwaltet:

Code: Select all

function _handleBeforePrint(inTopMostWindow, pageContent, pageHeader) {
let printHeader = document.getElementById(PRINT_HEADER_ID),
printContent = document.getElementById(PRINT_CONTENT_ID);

if (pageHeader) {
document.body.classList.add(CSS_PRINTING_IFRAME);
if (inTopMostWindow) {
printHeader.replaceChildren(pageHeader);
printContent.replaceChildren(pageContent);

} else {
printHeader.innerHTML = pageHeader;
printContent.innerHTML = pageContent.replace(/(style=")/gm, 'data-style="');

let elementsWithStyle = printContent.querySelectorAll("[data-style]");

for (let index = 0; index < elementsWithStyle.length; index++) {
let element = elementsWithStyle[index];

element.style.cssText = element.getAttribute("data-style");
element.removeAttribute("data-style");
}
}
}

_automateLandscapePrinting();
}
Frage
Kann ich das Beforeprint-Ereignis überhaupt verzögern, damit die Nachricht empfangen wird, die Funktionen ausgeführt werden und dann der Druck erfolgt? Oder gibt es andere Lösungen, die dafür sorgen würden, dass dies ordnungsgemäß funktioniert?
Getestet
Ich habe versucht, mit setTimeout eine Verzögerung zu simulieren.
Erwartungen
Die Informationen aus dem Iframe sollten in die Elemente printHeader und printContent im oberen Fenster eingefügt werden, bevor die Seite gedruckt wird.