16

在 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');})();");

也可以正常工作。

我的问题是,阻止 eval 直接调用它的 window.external.notify() 是什么?它是一个函数调用,如 window.alert(),所以它应该是一个有效的脚本。但是,如果 1) 中的简单调用有什么特别之处,那么为什么 3) 中的封装调用会起作用?

我知道 eval() 是万恶之源,并且我已经阅读了其他与 eval() 函数定义问题相关的 SO 帖子。(如果没有 SO,我们都会在哪里?)但这显然是一个不同的问题。

4

2 回答 2

0

我认为这与调用 that 的上下文有关eval(...)

如果调用eval("window.external.notify('abc');"),则应在全局window上下文中调用脚本。

您可以检查以下上下文以启动当前上下文:
eval("console.log(this); window.external.notify('abc');")

然后尝试以这 3 种方式进行测试,以检查上下文是否有任何差异。

要指定要运行的上下文,您可以使用callapply使用第一个参数设置上下文。

于 2014-11-13T09:38:35.913 回答
0

要从 C# 在 WebView 中执行 JavaScript 代码,请使用 InvokeScript 并从 C# 中的 java 脚本函数中获取值,请在 java 脚本函数中使用 window.external.notify。要从 java 脚本函数中捕获 C# 中的值,请使用以下代码。

private void Web_OnScriptNotify(object sender, NotifyEventArgs e)
{
    Debug.WriteLine("Called from ScriptNotify! {0}", new[] { e.Value });
}
于 2016-04-25T12:50:16.197 回答