Ваша проблема заключается в следующем
Сначала вы создаете текстовый узел в
let pageContent = document.createTextNode(createPrintableText(criteria));
Затем вы берете этот текстовый узел и добавляете его в тело iframe
body.appendChild(pageContent);
Вот почему "html", возвращаемый createPrintableText
, отображается как есть, потому что вы сказали: "Я хочу, чтобы содержимое было таким же, как оно есть"
Что выхочу сделать, это взять HTML как строку и добавить его к body.innerHTML
следующим образом - две строки, помеченные ****
, являются единственными необходимыми изменениями
let iframe = document.createElement("iframe");
iframe.setAttribute('id', 'printerIFrame');
iframe.setAttribute('name', 'printerIFrame');
iframe.setAttribute('style', ' z-index: 1000;');
iframe.setAttribute('media', 'print');
// **** assuming createPrintableText(criteria) returns the HTML you need
let pageContent = createPrintableText(criteria);
// ADD iFrame to document
document.body.appendChild(iframe);
// POPULATE iFrame with print material
iframe = document.getElementById("printerIFrame");
body = iframe.contentWindow.document.getElementsByTagName('body')[0];
// **** add the HTML to body innerHTML - that way it's treated as HTML
body.innerHTML = pageContent;
// GET iFrame `window`
var x = document.getElementById("printerIFrame").contentWindow;
// IF NOT IE or Edge
x.document.close();
x.focus();
x.print();
iframe.parentNode.removeChild(iframe);