Electron / Nativefier Web App - новая проблема печати окон [HTML, JS] - PullRequest
1 голос
/ 31 марта 2020

Я создал настольное приложение с Nativefier , основанным на Eelectron JS. Я сталкиваюсь с проблемой печати, проблема проявляется только при попытке открыть новое окно с предварительным просмотром для печати.

У меня много таблиц, и к каждой из них прикреплен этот код для печати (с небольшими отличиями):

    function printData3()
{
   var divToPrint=document.getElementById("myTable");
    var htmlToPrint = '' +
        '<style type="text/css">' +
        'table th, table td {' +
        'border:1px solid #000;' +
        'padding:0.5em;' +
        '}' +
        '</style>';
    htmlToPrint += divToPrint.outerHTML;
    newWin = window.open("");
    newWin.document.write(htmlToPrint);
    newWin.print(htmlToPrint);
    newWin.close();
}

$(document.getElementById("print-pred")).on('click',function(){
printData3();
})

Это нормально работает во всех браузерах в нормальных условиях, но в приложении происходит сбой с ошибкой:

Uncaught TypeError: Cannot read property 'write' of undefined
    at printData3 (rad.php:1373)
    at HTMLButtonElement.<anonymous> (rad.php:1379)
    at HTMLButtonElement.dispatch (jquery.min.js:2)
    at HTMLButtonElement.v.handle (jquery.min.js:2)

И эта строка ошибки ссылается на: newWin.document.write(htmlToPrint); из кода, показанного выше.

Однако этот код работает нормально и сразу же запускает диалоговое окно печати:

function myFunction() {
  window.print();

Ведьма заставила меня поверить (это предположение, верно, если я ошибаюсь), проблема в открытии нового окно с предварительным просмотром печати, так как само веб-приложение Chromeless и дизайн для работы только в одном окне.

Теперь, как упоминалось ранее, этот код реализован чуть менее чем в 100 экземплярах с некоторыми вариациями, поэтому для меня было бы большой проблемой изменить его все вместе во всех местах.

Так что мой вопрос Можно ли как-то минимально изменить первый код, показанный выше, чтобы сначала перейти к диалоговому окну печати (пропуская новую часть предварительного просмотра окна)? Так что я могу сделать простой поиск / заменить все файлы.

РЕДАКТИРОВАТЬ: Решение опубликовано как ответ.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Нашел решение.

htmlToPrint += divToPrint.outerHTML;
newWin = window.document.write(htmlToPrint);
window.print();
location.reload();

Я не открываю новое окно. В текущем я открываю документ и записываю в него таблицу, открываю диалоговое окно печати окна и сохраняю как PDF или распечатываю его. После того, как я его закрываю, папка перезагружается и закрывает новый документ самостоятельно и возвращается на страницу таблицы.

Работает в браузере и приложении.

0 голосов
/ 31 марта 2020

Я не очень знаком с "Nativefier", но, думаю, newWin переменная не имеет свойства, подобного "document", об этом говорит ошибка. Но с Электроном вы можете использовать метод webContents - executeJavascript:

// Warning: pure Electron, no add-ons or something like Nativefier
const { app, BrowserWindow } = require('electron')
const path = require('path')

app.once('ready', () => {
  var mainWindow = new BrowserWindow()
  mainWindow.loadURL(path.join(__dirname, 'index.html'))
  mainWindow.webContents.executeJavaScript(`
    document.getElementById("list").innerHTML += '<h1>Hey Wassup</h1>'
  `)
    }
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...