WebView.InvokeScriptAsync无法在通用应用程序中工作

时间:2014-11-18 01:30:15

标签: javascript c# windows-8.1 win-universal-app

我正在使用webview来显示某个html文件,但是,当我调用InvokeScriptAsync时,我一直遇到错误。 “未知名称。(HRESULT异常:0x80020006(DISP_E_UNKNOWNNAME))”。在NavigationComplete或DOMContentLoaded中调用脚本时会发生这种情况。

我准备了一个简单的应用来调试这个问题,我注意到当脚本在一个单独的.js文件中时,会发生错误。但如果将其放在html文件中,则不会发生错误。

我希望将脚本放在一个单独的文件中,因为我有很多要实现的功能,而且我会使用一些第三方脚本,所以在html文件中有所有脚本都无法维护。 / p> 顺便说一句,我确实在非通用应用程序中尝试了相同的代码并且只使用了Windows 8.1商店应用程序,即使脚本存储在单独的文件中也能正常工作。这就是为什么必须有一些我缺少的设置才能在通用应用程序中完成这项工作。

这是我的MainPage代码:

public sealed partial class MainPage : Page

{

    public MainPage()
    {
        this.InitializeComponent();
        MapWebView.NavigationCompleted +=MapWebView_NavigationCompleted;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
            Uri url = new Uri("ms-appx-web:///Common/Web/SamplePage.html");
            MapWebView.Navigate(url);
    }

    private async void MapWebView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
    {
        try
        {
             await MapWebView.InvokeScriptAsync("SayHello", new string[] { "Hello! This is a test parameter" });
        }
        catch(Exception e)
        {
            string error = e.Message;
        }
    }
}

NOT WORKING(脚本在一个单独的文件中,即sample.js): html文件:

<!DOCTYPE html>

    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <script type="text/javascript" src="sample.js"></script>
        <p>Parameter From Script File:</p> <div id="paramDiv"></div>
    </body>
    </html>

sample.js文件:

function SayHello(parameter) 
{
    document.getElementById('paramDiv').innerHTML = parameter;
}

工作(脚本在html文件中):

<!DOCTYPE html>

    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <script>
            function SayHello(parameter) {
                document.getElementById('paramDiv').innerHTML = parameter;
            }
        </script>
        <p>Parameter From Script File:</p> <div id="paramDiv"></div>
    </body>
    </html>

以下是我的项目设置: 我将我的项目设置为通用应用程序。在通用应用程序的共享代码部分中,我有以下文件

  • 普通(文件夹)
    • 网络
      • SamplePage.html
      • sample.js

1 个答案:

答案 0 :(得分:1)

在浪费了我一整天之后,我找到了解决这个问题的方法。 它是由* .Shared.projitem中的javascript文件标记错误引起的。

javascript文件在ItemGroup中被标记为NONE,这似乎导致找不到它。要使其对项目可见,请将其更改为“内容”。

 <ItemGroup>
    <None Include="$(MSBuildThisFileDirectory)Common\Web\sample.js" />
 </ItemGroup>

请参阅此链接,我也发布了解决方案。 https://social.msdn.microsoft.com/Forums/windowsapps/en-US/b29feddb-ae39-4580-9114-43839aabbcf2/webviewinvokescriptasync-not-working-in-universal-app?forum=winappswithcsharp