Google Maps e HTML Doctype

Já lá vai algum tempo desde que mexi na API do Google Maps e ontem dei por mim a bater com a cabeça na parede por não conseguir pôr a funcionar uma coisa tão simples quanto um mapa numa página XHTML Strict de uma aplicação web que estou a construir com o Google App Engine (yeah, I’m a Google biatch). O código estava correcto, o HTML era válido, até alterei o Javascript para ser idêntico ao que é dado nos exemplos da documentação - e nada. O mapa simplesmente não aparecia.

Após alguma experimentação, lá descobri alguns problemas.

O primeiro era bastante subtil e foi devido a copiar o código dos exemplos deles sem olhar. O exemplo base de como colocar um mapa numa página define este pedaço de código:

Ora em XHTML Strict, a altura dos elementos base “html” e “body” não está definida à partida, portando dizer que aquele “div” tem uma altura de 100%, é dizer que a sua altura é a totalidade da altura do elemento pai, o que não tem efeito nenhum, pois o elemento pai não tem altura definida, e 100% de uma quantidade indefinida, é também uma quantidade indefinida. Logo, nada de mapa, pois não tinha altura e por isso não era visível.

Como resolver? Simples, em CSS:

html, body {height: 100%}

Mas isto era apenas para pôr o exemplo base a funcionar, porque o que eu queria era garantir que o mapa estava a funcionar e partir daí para o que eu queria fazer, dando-lhe as dimensões pretendidas (e também não me apetecia ter CSS inline no HTML).

Com isto e com o código do exemplo, o mapa já aparecia. Mas implementando estas alterações no meu código, nicles, o mapa ia-se novamente. De volta à caça do problema invisível…

O próximo problema foi o facto de ter especificado o doctype do HTML como XHTML Strict, bem como o namespace do XHTML. Ou seja:

Lá andei a procurar na web e lá percebi o porquê: a API do Google Maps usa uma iframe para mostrar o mapa mas como iframes não existem no doctype de XHTML Strict, kaput, nada feito. Para testar a teoria eliminei o doctype por completo e passando o código acima para isto: o mapa já aparecia. O problema é que desta forma o meu HTML já não era válido. E eu quero o meu HTML válido!

Tinha então duas opções para poder continuar a usar o mapa:

  1. passava a usar HTML inválido;
  2. ou, uma solução que li algures num grupo de discussão, que consistia em criar o mapa todo "manualmente" através da API do Google Maps, em vez de usar o simpático método google.maps.Map().

Infelizmente nenhuma das duas soluções me satisfazia. A primeira estava totalmente fora de questão. A segunda era válida mas não me agradava - quando progredir na implementação do mapa, até devo acabar por usar muitos dos métodos que utilizaria desta forma mas irrita-me não poder usar uma coisa de uma maneira que está ali à mão de semear, portanto nem liguei muito a essa hipótese (e por isso nem sei explicar bem em que consistia mas assumo que fosse replicar manualmente tudo o que o método Map() faz).

Tinha que encontrar uma terceira solução.

Lembrei-me logo de HTML 5, que simplifica bastante toda esta treta dos doctypes e afins. Felizmente o W3C é suficientemente simpático para ter uma página dedicada às diferenças do HTML 4 para o HTML 5, que me deu a informação necessária (e mais alguma interessante).

E assim passei disto:

para isto:

Et voilá! Problema resolvido. Fico com um doctype muito mais simples, desde que o servidor sirva as páginas como text/html os browsers vão usar o modo de standards, e tenho o mapa a funcionar.

Acho que vou passar a usar este doctype de agora em diante. Desde que não use, por enquanto, nenhuma das coisas novas do HTML 5 que ainda não são suportadas pelos browsers, não deverei ter problemas. :)

Be the first to know when I post cool stuff

Subscribe to get my latest posts by email.

powered by TinyLetter