Для десктопа WebBrowser
(WinForms / WPF) на веб-странице должен присутствовать хотя бы один тег <script>
, чтобы InvokeScript("eval", ...)
работал. То есть, если страница не содержит JavaScript (например, <body></body>
), eval
не работает как есть.
У меня не установлен Windows Phone SDK / эмулятор, чтобы проверить, так ли это и с Windows Phone WebBrowser
.
Тем не менее, следующее приложение для Магазина Windows работает. Хитрость заключается в том, чтобы сначала использовать this.webBrowser.InvokeScript("setTimeout", ...)
для добавления некоторого JavaScript. Я использую его вместо execScript
, что устарело с IE11.
async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
// load a blank page
var tcsLoad = new TaskCompletionSource<object>();
this.webBrowser.NavigationCompleted += (s, eArgs) =>
tcsLoad.TrySetResult(Type.Missing);
this.webBrowser.NavigateToString("<body></body>");
await tcsLoad.Task;
// first add a script via "setTimeout", JavaScript gets initialized
var tcsInit = new TaskCompletionSource<object>();
this.webBrowser.ScriptNotify += (s, eArgs) =>
{
if (eArgs.Value == "initialized")
tcsInit.TrySetResult(Type.Missing);
};
this.webBrowser.InvokeScript("setTimeout",
new string[] { "window.external.notify('initialized')", "0" });
await tcsInit.Task;
// then use "eval"
this.webBrowser.InvokeScript("eval",
new string[] { "document.body.style.backgroundColor = 'yellow'" });
}
Буду признателен, если кто-нибудь сможет подтвердить, работает ли это для WP WebBrowser
или нет. LoadCompleted
следует использовать для WP вместо NavigationCompleted
в приведенном выше коде, а WebBrowser.IsScriptEnabled
необходимо установить на true
.