Как дождаться окончания загрузки нокаута перед печатью в DotNetBrowser?
Я пытаюсь печатать, используя DotNetBrowser, используя такой код:
public void PrintUrl(string url)
{
using (var browser = BrowserFactory.Create())
{
browser.PrintHandler = this;
_waitEvent = new ManualResetEvent(false);
browser.FinishLoadingFrameEvent += (sender, e) =>
{
if (e.IsMainFrame)
{
browser.Print();
}
};
browser.LoadURL(url);
_waitEvent.WaitOne();
}
}
public PrintStatus OnPrint(PrintJob printJob)
{
printJob.PrintJobEvent += (sender, args) => _waitEvent.Set();
return PrintStatus.CONTINUE;
}
Страница, которую я пытаюсь распечатать, отображается с помощью Knockout. Элементы HTML привязаны к модели Javascript Knockout. Модель инициализируется при выполнении Javascript и обновлении HTML.
Я получаю только пустую страницу.
Я предполагаю, что происходит то, что FinishLoadingFrameEvent основного фрейма запускается до выполнения Javascript - или-- событие запускается после выполнения Javascript, но до обновления связанных элементов HTML.
Я могу заставить печать работать, добавив следующий код прямо перед вызовом печати:
browser.FinishLoadingFrameEvent += (sender, e) =>
{
if (e.IsMainFrame)
{
// executing javascript seems to update the DOM
browser.ExecuteJavaScriptAndReturnValue("window");
browser.Print();
}
};
Вызов ExecuteJavaScriptAndReturnValue, кажется, работает, но я не знаю, надежно ли это. Есть ли верный способ заставить DOM обновляться на основе базовой модели KO?
Сама страница содержит блок скрипта, который вызывает ko.applyBindings(), и, если я выполню это вместо "окна", он также, похоже, будет работать.
Это надежно, хотя? Похоже на взлом.
1 ответ
Кажется, что модель DOM генерируется после загрузки страницы. В этом случае DotNetBrowser сообщает, что страница загружена, но содержимое еще не обновлено библиотекой Knockout.
Есть несколько вариантов для этого случая.
Опция 1:
Выполните ko.ApplyBindings(), как вы упомянули. После выполнения метода содержимое веб-страницы должно быть загружено и готово к печати.
Вариант 2:
Уведомить сторону.NET о том, что контент загружается с помощью JS-.NET Bridge. В этом случае вам нужно внедрить объект.NET в Javascript. Этот объект должен содержать метод, который запускает печать. После загрузки DOM Knockout должен вызвать этот метод.