Usando o Google Maps no ColdFusion
-
09-06-2019 - |
Pergunta
Estou tentando usar a API do Google Maps em um modelo ColdFusion que é um contêiner cflayoutarea do tipo borda.No entanto, o mapa simplesmente não aparece:
<cfif isdefined("url.lat")>
<cfset lat="#url.lat#">
<cfset lng="#url.lng#">
</cfif>
<head>
<script src= "http://maps.google.com/maps?file=api&v=2&key=xxxx" type="text/javascript">
function getMap(lat,lng){
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map_canvas"));
var pt= new GLatLng(lat,lng);
map.setCenter(pt, 18,G_HYBRID_MAP);
map.addOverlay(new GMarker(pt));
}
}
</script>
</head>
<cfoutput>
<body onLoad="getMap(#lat#,#lng#)" onUnload="GUnload()">
Map:<br>
<div id="map_canvas" style="width: 500px; height: 300px"/>
</body>
</cfoutput>"
onde lat e lng são as coordenadas em formato grau.decimal.Rastreei até a linha onde GBrowserIsCompatible() de alguma forma nunca retorna TRUE e, portanto, nenhuma ação adicional foi tomada.
Se aberto separadamente, o modelo funciona perfeitamente, mas não quando aberto como um contêiner cflayoutarea.Alguém tem experiência nisso?Qualquer sugestão é muito apreciada.
Lourenço
Usando CF 8.01, Dreamweaver 8
Tentei sua sugestão, mas ainda não funciona;o mapa só mostra quando o código de chamada está embutido.No entanto, se esta página contêiner for chamada de outro div, o mapa desaparecerá novamente.
Suspeito que esse problema esteja relacionado ao contêiner clayout;Vou procurar o documento Extjs para ver se há alguma pista para uma solução.
Solução
Sucesso!(tipo de...)
Finalmente consegui funcionar, mas não da maneira que Adam sugeriu:
<script src= "http://maps.google.com/maps?file=api&v=2&key=xxxx" type="text/javascript"></script>
<script type="text/javascript">
getMap=function(lat,lng){
if (GBrowserIsCompatible()){
var map = new GMap2(document.getElementById("map_canvas"));
var pt = new GLatLng(lat,lng);
map.setCenter(pt, 18,G_HYBRID_MAP);
map.addOverlay(new GMarker(pt));
}
}
</script>
<cflayout name="testlayout" type="border">
<cflayoutarea name="left" position="left" size="250"/>
<cflayoutarea name="center" position="center">
<!--- sample hard-coded co-ordinates --->
<body onLoad="getMap(22.280161,114.185096)">
Map:<br />
<div id="map_canvas" style="width:500px; height: 300px"/>
</body>
</cflayoutarea>
<!--- <cflayoutarea name="center" position="center" source="map_content.cfm?lat=22.280161&lng=114.185096"/> --->
</cflayout>
A coisa toda deve estar contida no mesmo arquivo ou não funcionaria.Minha suspeita é que a função getElementByID, tal como está, não pode deixar de fazer referência a um elemento que está fora de seu próprio arquivo.Se o div estiver em outro arquivo (como no exemplo de Adam), isso resulta em um mapa indefinido, ou seja, um objeto de mapa é criado, mas sem nada nele.
Então acho que esta questão agora foi elevada a um nível diferente:como você faz referência a um elemento que está dentro de um contêiner ajax?
Outras dicas
Então acho que esta questão agora foi elevada a um nível diferente:como você faz referência a um elemento que está dentro de um contêiner ajax?
Deveria ser possível fazer referência a um elemento carregado via AJAX - mas não até que o elemento esteja na tela (portanto, não no carregamento da página).Parece que getMap() aciona tudo.(Isso está certo?)
Experimente isto:Pegue exatamente o que você tem como conteúdo embutido para a guia do mapa e torne-o o conteúdo de map_content.cfm; então em vez de usar body onload para disparar o evento, escreva-o inline, depois que o div for definido:
<body>
Map:<br />
<div id="map_canvas" style="width:500px; height: 300px"/>
<script type="text/javascript">
getMap(22.280161,114.185096);
</script>
</body>
Talvez a área de layout não tenha o direito estilo.Eu acho que você pode ter que dar ao map_canvas uma
position: absolute
ou
position: relative
Isso é apenas um palpite.
CFLayoutArea é uma nova tag AJAX adicionada com o ColdFusion versão 8.(Além de tags como CFWindow, CFDiv, etc.)
Dentro do conteúdo carregado em AJAX de qualquer uma dessas novas tags, o JavaScript externo deve ser incluído na página que as contém.No seu caso, seria a página que inclui a tag <cflayout>.
Tente algo assim:
em index.cfm (ou qualquer que seja o arquivo que contém):
<script src="http://maps.google.com/maps?file=api&v=2&key=xxxx" type="text/javascript">
function getMap(lat,lng){
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map_canvas"));
var pt= new GLatLng(lat,lng);
map.setCenter(pt, 18,G_HYBRID_MAP);
map.addOverlay(new GMarker(pt));
}
}
</script>
<cflayout>...</cflayout>
map.cfm (conteúdo da guia CFLayout do seu mapa):
<cfif structKeyExists(url, "lat")>
<cfset variables.lat = url.lat />
<cfset variables.lng = url.lng />
</cfif>
<head></head>
<cfoutput>
<body onLoad="getMap(#variables.lat#,#variables.lng#)" onUnload="GUnload()">
Map:<br>
<div id="map_canvas" style="width: 500px; height: 300px"/>
</body>
</cfoutput>