将外部Javascript文件注入html页面并在其上执行WP8 Webbrowser上的方法

时间:2013-11-20 11:27:07

标签: javascript windows-phone-8

我正在努力在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上的这些方法

1 个答案:

答案 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中没有错误。

希望这有帮助!