jQuery Mobile でGoogle Mapsを表示する際の注意点。PCのブラウザに表示する場合と基本的には同じだが、(1)地図表示のタイミング、(2)表示するdiv領域のheight指定、がポイントになる。
mlocplan01.html

- 地図の表示領域を用意する
<!-- HTML -->
<div data-role="page" id="pgSpotMap">
<div data-role="header" ><h2>Map</h2></div>
<div data-role="content">
<div id="mMap" class="ui-shadow"></div>
<!-- class="ui-shadow"で要素に影をつける。<div id="mMap"> でも地図表示はOK-->
</div>
</div>
HTMLでjQuery Mobileのページ(#pgSpotMap)に領域(#mMap)を用意した。
// JavaScript
var gMap = null;
$(document).on('pageshow','#pgSpotMap', drawMap );
ページ(#pgSpotMap)が表示されるタイミングで、地図を表示する自作の関数 drawMapを呼び出す。どのイベントを捕捉すべきかは考慮の余地あり。
地図の初期化:ページが表示される最初の1回だけでいいので、以下のようにする。
// JavaScript
function drawMap(){
if (gMap == null){
initMapM(); // 地図の初期化
}
}
さらに、地図を表示するdiv領域(#mMap)のheightを指定する。これはGoogle Mapsの仕様上必須。あとは通常の地図表示と同じ。
// JavaScript
function initMapM(){
var bodyHeight = $('body').height();
$("#mMap").css('height',bodyHeight); // 地図領域の高さを明示的に指定
// 以下は通常と同じ
var latlng = new google.maps.LatLng(35.709984, 139.810703);
var opts = {
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
gMap = new google.maps.Map(document.getElementById('mMap'), opts);
}
heightの設定については、実際のページの構成に応じて個別に考える必要がある。ちなみに、’div id=”mMap” class=”ui-shadow”‘とすると、コピーライトの文字が隠れてしまうようだ。また、jQuery MobileがいろいろDOMを操作するので、(再)設定するタイミングについても検討の余地あり。
ヘッダとフッタ以外を地図で埋めたい場合、サイズはとりあえず以下のように設定するといいようだ。(ページのidは’#pgSpotMap’、地図を表示するdiv領域のidが’#mMap’の場合。)
// JavaScript
var height = $(window).height() -
$('#pgSpotMap').find('[data-role="header"]').outerHeight() -
$('#pgSpotMap').find('[data-role="footer"]').outerHeight();
var width = $(window).width() - 20; // 20は左右の余白分。
$('#mMap').height(height);
$('#mMap').width(width);
Google Maps Referenceには、’Developers should trigger this event on the map when the div changes size:’ とあるので、Google Mapsの表示領域のサイズを変更したタイミングでresizeイベントを発生させる。
google.maps.event.trigger(gMap, 'resize');


