Я создаю инструмент для экспорта HTML ввода в PDF. Для разбивки на страницы я использую Paged. js polyfill . Этот polyfill запускается после загрузки содержимого DOM, и мне нужно дождаться его окончания sh перед генерацией PDF. Для этого я определил пользовательское событие во входном файле HTML, которое выглядит следующим образом:
<script>
window.PagedConfig = {
after: (flow) => {
console.log(`After polyfill | total pages: ${flow.total} | performance: ${flow.performance} `);
document.dispatchEvent(new CustomEvent('polyfillFinished'));
}
};
</script>
При открытии файла HTML в браузере это событие срабатывает очень хорошо, но когда я жду триггер события, использующий Puppeteer's evaluateOnNewDocument
, работает непрерывно почти сразу до того, как событие сработало. Код Puppeteer основан на примере пользовательского события и выглядит следующим образом:
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on("console", (msg) => console.log("Page log:", msg.text()));
// Define a window.onCustomEvent function on the page.
await page.exposeFunction("onCustomEvent", (e) => {
console.log(`${e.type} fired`, e.detail || "");
});
/**
* Attach an event listener to page to capture a custom event on page load/navigation.
* @param {string} type Event name.
* @return {!Promise}
*/
function listenFor(type) {
return page.evaluateOnNewDocument((type) => {
document.addEventListener(type, (e) => {
window.onCustomEvent({ type, detail: e.detail });
});
}, type);
}
await page.goto(options.input);
await listenFor("polyfillFinished"); // Listen for "polyfillFinished" custom event on page load.
/* ... Generate PDF ... */
} catch (err) {
console.error("An error occurred while generating output: ", err);
}