如何在Delphi XE6中通过javascript从TWebBrowser回调Delphi函数以支持所有平台(包括iOS和ANDROID)?

7
我需要在Delphi XE6上为Android和iOS创建一个应用程序。该应用程序必须使用TWebBrowser来显示Google Maps,因此我需要从Delphi向JavaScript“发送”命令,并从JavaScript接收命令以便在地图上显示标记,并知道用户何时单击标记。我在网络上找到了这篇文章,它介绍了如何通过Delphi代码执行JavaScript的操作:article
但是我不知道如何从JavaScript调用Delphi过程。例如,我有一个在Delphi中的过程:
procedure JSFeekback(aParm1, aParm2, aParm3, aParm4: string);

我想在TWebBrowser上使用Javascript代码调用它并传递4个参数。我已经找到了类似的问题,但只适用于Windows应用程序,答案在Android上不起作用(我没有在iOS上尝试过)。


如果你还没有看过的话,可以查看这个链接。虽然它是使用COM(也就是Windows)完成的,但可能会给你一些想法。另一方面,我在Google groups中也发现了这个链接,他们讨论如何使用TChromium而不是TWebBrowser来完成它。也许值得一看(如果TChromium可以用于iOS/Android?) - Guillem Vicens
3个回答

4
正确的方法是使用Android WebView的addJavascriptInterface函数,可以在这里这里这里看到。
Firemonkey TWebBrowser默认不公开此功能。
在DPF Android中可以看到一个自定义的WebView包装器控件,在这里查看。
您可以修改该控件以添加addJavascriptInterface函数。
对于IOS上的TWebBrowser,您可以使用sourceforge这里的自定义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&param2&param3&param4或者javascript:thisisatest();

基本思路是导航到一个不改变现有页面URL并在OnShouldStartLoadWithRequest事件中获取该URL。


1
使用JavaScript访问HTTP服务器非常普遍,例如通过jQuery。如果您可以将Delphi代码作为本地服务器或Web上的可用资源进行HTTP公开,则您的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
@Martin 我已经更新了我的答案,也许对其他人有帮助。 - mjn

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接