【问题标题】:Callback Delphi function from TWebBrowser by javascript on Delphi XE6 for all platforms (including iOS, ANDROID)?在所有平台(包括iOS,ANDROID)的Delphi XE6上通过javascript从TWebBrowser回调Delphi函数?
【发布时间】:2014-06-18 10:14:06
【问题描述】:

我需要在 Delphi XE6 上为 Android 和 iOS 创建一个应用程序。 这个应用程序必须使用 TWebBrowser 来显示 Google 地图,然后我需要从 Delphi“发送”到 javascript,并从 javascript 到 Delphi “接收”命令。通过这种方式,我可以在地图上显示市场,然后知道用户何时点击标记。 我在网上找到了这个article,可以通过 Delphi 代码执行 javascript。

但我不知道如何从 javascript 调用 delphi 过程。 例如我在 Delphi 上有这个程序:

procedure JSFeekback(aParm1, aParm2, aParm3, aParm4: string);

我想在 TWebBrowser 上使用 Javascript 代码将其称为 pass 4 参数。 我发现了类似的问题,但仅适用于 Windows 应用程序,并且答案在 Android 上不起作用(我没有在 iOS 上尝试过)。

【问题讨论】:

  • 如果您还没有,请检查此link。虽然它是用 COM(ergo Windows)完成的,但它可能会给你一些想法。另一方面,我还在Google groups 中找到了这个链接,他们在其中谈到了如何使用TChromium 而不是TWebBrowser。可能值得一看(如果TChromium 可以用于iOS/Android?)

标签: javascript android ios delphi


【解决方案1】:

正确的做法是使用Android WebView的addJavascriptInterface函数,如hereherehere

Firemonkey TWebBrowser 默认不公开此功能。

在 DPF Android 中有一个自定义的 WebView 包装控件,可以看到 here

您可以修改该控件以添加addJavascriptInterface 函数。

对于 IOS 上的 TWebBrowser,您可以使用 sourceforgehere 中的自定义 Web 浏览器控件。

另一种可能的方法是使用 TWebBrowser 的OnShouldStartLoadWithRequest 事件。你可以这样做:

<script language=”javascript” type=”text/javascript”>
window.location.href=”#param1&param2&param3&param4”;
</script>

<script language=”javascript”>
window.navigate(”javascript:thisisatest();”);
</script>

并查看OnShouldStartLoadWithRequest的URL属性是否包含#param1&amp;param2&amp;param3&amp;param4javascript:thisisatest();

基本上,这个想法是导航到一个不会更改现有页面 URL 的 URL,并在 OnShouldStartLoadWithRequest 事件中选择该 URL。

【讨论】:

    【解决方案2】:

    使用 JavaScript 访问 HTTP 服务器是很常见的,例如通过 jQuery。如果您可以通过 HTTP 提供您的 Delphi 代码,无论是作为本地服务器还是在 Web 上,您的 JavaScript 代码都可以通过发送 HTTP 请求来调用 Delphi 代码,并从 Delphi 函数接收数据作为 HTTP 响应。

    另一个选项是 WebSockets。它们是 HTTP 的扩展,异步工作,因此 Delphi 服务器可以将数据发送到脚本 - 无需先等待请求(称为服务器推送 / Comet)。

    这将是一个基于标准的、广泛使用的解决方案,它不依赖于特定的 Web 客户端。免费的开源库 Internet Direct (Indy) 可用于所有受支持的平台,以创建独立的或与您的应用程序集成的 HTTP 服务器。

    其他可用于 JavaScript 和服务器之间通信的协议也值得一看,例如 STOMP。

    对于您的特定功能,HTTP 调用可以使用带参数的 GET 请求:

    http://localhost/JSFeekback?par1=val1&par2=val2&par3=val3&par4=val4
    

    【讨论】:

    • 我的 Delphi 代码不能通过 HTTP 使用。我需要像@Guillem Vicens 评论这样的解决方案,但在 Android 和 iOS 上工作,我喜欢在 Delphi XE6 上使用新的 TWebBrowser。我认为 TChromium 有点复杂。
    • @Martin 我已经更新了我的答案,也许它对其他人有帮助
    【解决方案3】:

    TWebBrowser.URL 可以在 javascript 中更改:

    window.location.href=”#param1&param2&param3&param4”;
    

    然后运行计时器来检查 TWebBrowser.URL,获取参数,调用 JSFeekback,重置 URL。

    或者没有定时器,代码如下:

      wb1.EvaluateJavaScript("window.location.href=”#param1&param2&param3&param4”;");
      getParams(wb1.URL);
      JSFeekback(p1, p2, p3, p4);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 2014-09-25
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2023-03-09
      相关资源
      最近更新 更多