对于所有平台(包括iOS,ANDROID),在Delphi XE6上通过javascript调用TWebBrowser的Delphi Delphi函数?

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

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

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

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

正确的方法是使用Android WebView的addJavascriptInterface函数,可以在这里 , 这里和这里看到。

Firemonkey TWebBrowser默认情况下不公开此function。

DPF Android中有一个自定义WebView包装器控件,可以在这里看到。

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

对于IOS上的TWebBrowser,您可以在sourceforge和此处使用自定义Web浏览器控件。

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

  

要么

  

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

基本上,我们的想法是导航到一个不改变现有页面URL的URL,并在OnShouldStartLoadWithRequest事件中获取该URL。

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

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

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

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

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

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

可以在javascript中更改TWebBrowser.URL

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

然后运行一个计时器来检查TWebBrowser.URL,获取params,调用你的JSFeekback,重置URL。

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

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