Javascript eval() не работает с window.external.notify(), работает с window.alert()
В WP8, если я выполняю (1):
Microsoft.Phone.WebBrowser wb;
wb.InvokeScript("eval", "window.external.notify('abc');");
Он выдает "цель вызова, возвращал ошибку", неизвестную ошибку, hresult 80020101.
Но (2)
wb.InvokeScript("eval", "window.alert('abc');");
работает нормально и отображает окно сообщения.
И (3)
wb.InvokeScript("eval", "( function (){window.external.notify('abc');})();");
Также отлично работает.
Мой вопрос: что это такое о window.external.notify(), которое не позволяет eval напрямую ссылаться на него? Это вызов функции, такой как window.alert(), поэтому он должен быть действительным script. Но если в 1) есть что-то особенное в неприкрашенном вызове, то почему обернутый вызов в 3) работает?
Я понимаю, что eval() является корнем всего зла, и я прочитал другие сообщения SO, связанные с проблемами eval() с определением функции. (Где мы все будем без SO?) Но это явно другая проблема.
Ответы
Ответ 1
Я думаю, что это связано с контекстом вызова, что eval(...)
.
Если вы вызываете eval("window.external.notify('abc');")
, script должен быть вызван в глобальном контексте window
.
Вы можете проверить контекст, как показано ниже, для подбора текущего контекста:
eval("console.log(this); window.external.notify('abc');")
Затем попробуйте протестировать эти 3 способа проверить, есть ли разница в контексте.
Чтобы указать один контекст для запуска, вы можете использовать call
или apply
для установки контекста с первым параметром.
Ответ 2
Для выполнения кода JavaScript в WebView с С# используйте InvokeScript и получая значения из функций java script в С#, используйте window.external.notify в функции java script.
для улова значения в С# из java script функции используют следующий код.
private void Web_OnScriptNotify(object sender, NotifyEventArgs e)
{
Debug.WriteLine("Called from ScriptNotify! {0}", new[] { e.Value });
}