在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,我们会在哪里?)但这显然是一个不同的问题。
答案 0 :(得分:0)
我认为这与调用eval(...)
。
如果您致电eval("window.external.notify('abc');")
,则应在全球window
背景下调用该脚本。
您可以按照以下方式检查上下文以确定当前上下文:
eval("console.log(this); window.external.notify('abc');")
然后尝试用这3种方法进行测试,检查上下文是否存在差异。
要指定一个要运行的上下文,您可以使用call
或apply
来设置第一个参数的上下文。
答案 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 });
}