我正在努力在WP8应用程序中的Webbrowser控件上执行Javascript方法。我使用的XAML是
<phone:WebBrowser IsScriptEnabled="True" x:Name="mainBrowserControl" Grid.Row="2"/>
按钮点击事件我将外部javascript文件testjs.js(此文件是应用程序包的一部分,位于xap文件中)到当前加载的html页面的head部分,如
string root = Package.Current.InstalledLocation.Path;
string jsfile_path = string.Format("{0}/testjs.js", root);
var script = string.Format(@"var script=document.createElement('script');
script.src=""{0}"";
document.getElementsByTagName('head')[0].appendChild(script);", jsfile_path);
mainBrowserControl.InvokeScript("eval", script);
然后在另一个按钮上点击甚至我试图在testjs.js文件中执行一个javascript方法,如
mainBrowserControl.InvokeScript("eval", "callMe();");
但它返回错误
发生了'System.SystemException'类型的异常 Microsoft.Phone.Interop.ni.dll但未在用户代码中处理
其他信息:发生了未知错误。错误: 80020101
testjs.js文件中的内容只是3个简单的函数。我的最终目标是与我的应用程序中的testjs.js之类的外部javascript文件进行交互(从javascript函数发送和接收值)
function callMe() {
alert("hello called");
}
function showSum(val1, val2) {
alert(val1 + val2);
}
function addTwo(val1,val2) {
return val1+val2;
}
如何从我的Windows手机应用程序中调用testjs.js上的这些方法
答案 0 :(得分:1)
更新:请参阅下面Noseratio中的评论和链接,只有在您将调用InvokeScript的网页上已有&lt; script&gt;时才会显示此选项。标记在它的头部。此标记可以为空,但必须存在。
在Windows Phone版本的webbrowser中,任何调用JavaScript的尝试都必须在页面加载完成后完成。如果您尝试在页面处于任何其他状态时调用JS,则会出现错误。
在您的XAML中,为“LoadCompleted”事件添加处理程序,如下所示:
<phone:WebBrowser IsScriptEnabled="True" LoadCompleted="DoneLoaded" x:Name="mainBrowserControl" Grid.Row="2"/>
将第二个按钮设置为“已禁用”(Visibility.Collapsed),以便用户无法单击它。然后,在页面的代码隐藏中,实现处理程序
private void DoneLoaded(object sender, NavigationEventArgs e)
{
Debug.WriteLine("Loading Complete: "+e.Uri);
if (e.Uri.ToString().Equals("/the_url_of_the_page_with_embedded_js.html"))
// Enable the button that will invoke the JS
// Or, simply perform the InvokeScript here
}
}
此时,您可以将Navigate / NavigateToString导航到包含JS的页面。完成加载后,上面的事件将触发并启用“执行”按钮。当页面加载完成后,Invoke不应再呕吐了。当然,这是假设JavaScript中没有错误。
希望这有帮助!