javascript eval()失败,使用window.external.notify(),与window.alert()一起使用

时间:2013-09-17 22:56:48

标签: javascript windows-phone-8 internet-explorer-10

在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(),因此它应该是一个有效的脚本。但是如果在1)中有一些关于未经修饰的电话的特别之处,那为什么3)中的包裹调用有效?

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

2 个答案:

答案 0 :(得分:0)

我认为这与调用eval(...)

的上下文有关

如果您致电eval("window.external.notify('abc');"),则应在全球window背景下调用该脚本。

您可以按照以下方式检查上下文以确定当前上下文:
eval("console.log(this); window.external.notify('abc');")

然后尝试用这3种方法进行测试,检查上下文是否存在差异。

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

答案 1 :(得分: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 });
}