如何在WebView Windows 10 UWP中调用javascript

How to invoke javascript in WebView Windows 10 UWP?

本文关键字:UWP 调用 javascript Windows WebView      更新时间:2023-09-26

我正试图在WebView中加载一个javascript来进行一些计算并获得字符串中的输出。我尝试使用以下代码

string htmlFragment = "<html><head><script type='text/javascript'>" +
                    "function doubleIt(incoming){ " +
                    "  var intIncoming = parseInt(incoming, 10);" +
                    "  var doubled = intIncoming * 2;" +
                    "  document.body.style.fontSize= doubled.toString() + 'px';" +
                    "  return doubled.toString());" +
                    "};" +
                    "</script></head><body>" +
                    "<div id = 'myDiv'>I AM CONTENT</div></body></html>";
            htmlView.NavigateToString(htmlFragment);
            htmlView.LoadCompleted += async(s1,e1) =>
              {
                  string result = await htmlView.InvokeScriptAsync("eval", new string[] { "doubleIt(25)" });
                  Debug.WriteLine(result);
              };

更新我现在可以根据答案中提供的帮助轻松加载简单的javascript了。但现在我面临的问题是,当javascript中有多个函数时,我会遇到一个异常。我正在尝试以下代码

string htmlFragment = @"<html><head><script type='text/javascript'>" +
                    "function a(){return 10;};" +
                    "function b(){return 20;};" +
                    "function c(){return 30;};" +
                    "return (a()*b()*c());" +
                    "</script></head><body>" +
                    "<div id = 'myDiv'>I AM CONTENT</div></body></html>";

请提出建议。

此功能的文档非常糟糕。我花了一些时间才弄清楚如何在UWP WebView 中调用Javascript

当你第一次看到函数调用webView.InvokeScriptAsync(string,string[])时,你的最初反应是他们希望函数名作为第一个参数,然后函数paramaeters作为字符串数组。(主要是因为MSDN文档中这样说)

参数

scriptName

类型:System.String[.NET]|平台::String[C++]

要调用的脚本函数的名称。

参数

类型:System.String[][.NET]|平台::数组[C++]

字符串数组将参数打包到脚本函数中。

然而,这是错误的,会导致数小时的头痛。实际上,他们想要的是第一个参数中的单词"eval",然后是一个函数的字符串数组,或者你想要评估的命令

   var value = await webViewer.InvokeScriptAsync("eval", 
      new string[] 
      { 
        "functionName(functionParams)" 
      });

在使用Microsoft API几年后,我确信这不是使用此功能的预期方式,而且有点像黑客。不幸的是,如果你想使用JavaScript,这是我所知道的目前唯一有效的方法。

Anthony,试着检查一下你自己的建议:

 await webViewer.InvokeScriptAsync("eval", 
  new string[] 
  { 
    "functionName(functionParams)" 
  });

或:

await webViewer.InvokeScriptAsync(functionName, new string[]{ functionParameters });

与微软建议的一样,只是你将函数名限制为一个("eval")——这是不必要的。相信我,你可以使用任何函数名,就像我现在使用UWP和以前使用windows手机混合应用程序一样。

这个问题已经有4年的历史了,但我来看看为什么你会得到一个空字符串。

在您的示例中,JavaScript中的函数返回整数,而期望值的类型为字符串。

通过修改这些函数并返回如下字符串:

string htmlFragment = @"<html><head><script type='text/javascript'>" +
                    "function a(){return '10';};" +
                    "function b(){return '20';};" +
                    "function c(){return '30';};" +
                    "</script></head><body>" +
                    "<div id = 'myDiv'>I AM CONTENT</div></body></html>";

我们在回来的路上取得了好成绩。