JavaScript中使用window.external.notify()会失败,但使用window.alert()可以正常工作。

23
在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我们都会怎样呢?)但这显然是一个不同的问题。


这可能与你的HTML中的某些内容有关。它可能会触发怪异模式或类似的东西。你能展示一下完整的问题重现吗? - Matt Lacey
1
感谢您提供(3)的解决方法,神保佑您。 - Victor Ionescu
2个回答

0

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

private void Web_OnScriptNotify(object sender, NotifyEventArgs e)
{
    Debug.WriteLine("Called from ScriptNotify! {0}", new[] { e.Value });
}

0

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

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

您可以通过以下方式检查上下文以打印当前上下文:
eval("console.log(this); window.external.notify('abc');");

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接