WebView.InvokeScriptAsync 在通用应用程序中不起作用

本文关键字:应用程序 不起作用 InvokeScriptAsync WebView | 更新日期: 2023-09-27 18:30:46

我正在使用webview来显示某个html文件,但是,当我调用InvokeScriptAsync时,我不断遇到错误。"名字不详。(HRESULT的例外:0x80020006(DISP_E_UNKNOWNNAME))"。即使脚本在 NavigationComplete 或 DOMContentLoaded 中调用,也会发生这种情况。

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

我希望将脚本

放在一个单独的文件中,因为我有很多功能要实现,并且我将使用一些第三方脚本,因此将所有脚本都放在 html 文件上是不可维护的。

顺便说一句,我确实在非通用应用程序中尝试了相同的代码,并且只使用了Windows 8.1商店应用程序,即使脚本存储在单独的文件中,它也可以正常工作。这就是为什么我必须缺少一些设置才能在通用应用程序中完成这项工作的原因。

这是我的主页代码:

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;
        }
    }
}

不起作用(脚本位于一个单独的文件中,该文件是示例.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>

样本.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>

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

  • 通用(文件夹)
      • 示例页面.html
      • 样品.js

WebView.InvokeScriptAsync 在通用应用程序中不起作用

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

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