我有一个Delphi应用程序,可以在嵌入式Web浏览器中加载Google Maps JavaScript API。它加载的页面如下所示:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style>
#map {
height: 400px;
width: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {});
}
</script>
<script async defer
src="https://maps.googleapis.com/maps/api/js?v=3.29&key=~APIKEY~&callback=initMap">
</script>
</body>
</html>
我在TWebBrowser
:
str := StringReplace(htmlBase, '~APIKEY~', cMapsAPIKey, []);
if not Assigned(WebBrowser.Document) then
WebBrowser.Navigate('about:blank', '1', '', '', 'User-Agent: Mozilla/5.0');
doc := WebBrowser.Document;
doc.Clear;
doc.Write(str);
doc.Close;
TWebBrowser.Navigate()
将使用我为主页提供的用户代理字符串,但它使用它来加载脚本:
User-Agent:Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 10.0; WOW64; Trident / 7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3)
从3.29开始,Google Maps JavaScript API似乎正在检查浏览器的用户代理并显示错误消息:&#34;您正在使用不受支持的浏览器&#34;。这不是3.28或更低的问题。支持浏览器(它使用的是IE 11),它只是发送了错误的用户代理字符串。
在JavaScript端,如何在不完全禁用警告的情况下覆盖用户代理检查?在Delphi端,有没有办法改变AJAX调用的用户代理?
修改:覆盖TWebBrowser.Invoke()
可让我更改所有HTTP请求的用户代理,但看起来navigator.userAgent
未被更改。
答案 0 :(得分:1)
您似乎在使用VCL&#39; TWebBrowser
。根据{{1}},您可以从Sub Main
AddHandler AppDomain.CurrentDomain.ProcessExit, AddressOf OnClose
End Sub
Sub OnClose(sender as object, e as EventArgs)
'codeon close
End Sub
派生一个新类,以覆盖其TWebBrowser
方法,以在请求Invoke()
属性时返回所需的UserAgent字符串。然后在浏览器中查询其DISPID_AMBIENT_USERAGENT
接口,并调用其IOleControl
方法向浏览器发出OnAmbientPropertyChange()
属性值已更改的信号。这篇文章有完整的代码。
为了更好地衡量,在FMX的Changing the UA (User Agent) of a TWebBrowser component中,根据TWebBrowser
,在Android上,您可以使用辅助类和RTTI技巧来访问浏览器的内部Java {{3对象并调用其Change User Agent for FireMonkey TWebBrowser方法。不确定Windows,但在iOS上,您不能通过Web浏览器本身自定义用户代理(除非您破解FMX框架以自定义它发送的请求),您必须创建一个包含名为{{的项目的字典1}}并使用其WebView
方法将其注册到全局WebSettings.setUserAgentString()
字典。你是如何在德尔福那样做的,我不知道。
答案 1 :(得分:0)
您的Google地图网页未在TWebBrowser组件中正常加载的问题是因为它在兼容模式下工作。这也是提到用户代理字符串的原因。
为什么会发生这种情况呢。那么TWebBrowser只是Internet Explorer浏览器API的包装器。根据Microsoft的决定,任何使用此类API的应用程序默认情况下都会在兼容模式下显示网页。
您可以使用以下说明禁用此功能: https://stackoverflow.com/a/25843958/3636228