【问题标题】:Execute Javascript in Xamarin.Forms WebView在 Xamarin.Forms WebView 中执行 Javascript
【发布时间】:2020-12-27 22:09:55
【问题描述】:

我正在尝试使用此处描述的教程在我的 Xamarin.Forms WebView 中执行 Javascript:

https://www.xamarinhelp.com/xamarin-forms-webview-executing-javascript/

Android 运行良好,但我在 iOS 上设置时遇到问题。在 iOS 自定义渲染器中,我基本上是通过

返回 js 执行结果

return Task.FromResult(this.EvaluateJavascript(js));

自去年以来,iOS api 发生了变化,这行在调试时会抛出错误。事实证明,我应该使用 WkWebViewRenderer 而不是 WebViewRenderer。我试图改变,但 EvaluateJavascript() 方法现在需要两个参数......一个是 js 字符串,一个是 WKJavascriptEvaluationResult 处理程序......

我不知道如何修改教程中的代码...有人可以帮忙吗?

【问题讨论】:

  • 尝试像this这样适配iOS渲染器
  • 如果需要,我不知道如何在运行时调用它并从中获取返回值。您建议的解决方案中的 javascript 看起来像一个在添加时运行一次的脚本。我需要按需获取 javascript 结果。

标签: javascript xamarin xamarin.forms webview wkwebview


【解决方案1】:

应该是这样的:

    WKJavascriptEvaluationResult handler = (NSObject result, NSError error) => {
        if (error != null)
        {
            Console.WriteLine(result.ToString());
        }
    };
    webView.EvaluateJavaScript(JSCode, handler);
    

【讨论】:

  • 我有一个 lambda 表达式,我需要返回一些东西。我无法返回 webView.EvaluateJavaScript(js, handler); 的结果因为它是 void 类型
  • 您可以在处理程序中获得结果,正如我在答案中所写:Console.WriteLine(result.ToString());
  • 这是对的,但我如何将结果放入我的表单页面?需要拿来。在我的示例中,虽然界面很简单,但它不再工作了。我试图在处理程序中设置一个变量: x = result.ToString();并返回 x 但这仅在我调用 Javascript 函数两次时才有效。
  • 到您的表单页面? messaging-center 怎么样?
  • 不,我的意思是我通过 var result = await EvaluateJavascript("javascriptfunction"); 在表单页面上的视图模型上用一行调用该函数这给了我来自 iOS 和 Android 的结果。由于 return Task.FromResult(this.EvaluateJavascript(js));在 iOS 端不再工作我不知道如何将值返回给我的视图模型。我可以 Console.WriteLine() 处理程序结果,但我无法返回它
【解决方案2】:

我只是变了

return Task.FromResult(this.EvaluateJavascript(js));

到:

var x = await webView.EvaluateJavascriptAsync(js);
return x;

现在可以了

【讨论】:

  • 好的,你可以稍后标记这个答案,这将帮助更多有同样问题的人:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2015-04-19
  • 1970-01-01
  • 2020-06-05
  • 2012-04-12
  • 2021-05-28
相关资源
最近更新 更多