2

これは、このサイトや他の場所で報告されている一般的な問題であることを知っています。

しかし、私は自分の問題を解決できません。

だから私はモバイルを最初に構築したレスポンシブサイトを持っていて、アダプティブマップソリューションを機能させようとしています。つまり、モバイルビューポートは静的なGoogleマップ画像を取得し、非モバイルビューポートの場合は完全なGoogleマップAPIを取得します。これはすべてそれ自体を更新する必要がありますページの読み込み時だけでなく、ビューポートのサイズが変更されたとき。これに基づく: http://codepen.io/bradfrost/pen/tLxAs

このライブラリを使用しています。

$.getScriptjQueryおよびライブラリsetup()defer()関数を介して、必要な場合 (非モバイル ビューポート) にのみ Maps API を条件付きでロードしています。

jQuery を使用している各ビューポートで適切なマップ レンダリングのみが存在するhide()ようshow()にします。このため、API マップはそれ自体を完全にはロードしません (1 タイルのみ)。ページがモバイル以外のビューポートでロードされた場合でも、正常にロードされます。それは、モバイル ビューポートのサイズを非モバイル ビューポート サイズに戻すときです。これは、show()メソッドが作動するときです。それ以外はすべて正常に動作します。

これが私のコードです:

HTML

<div class="map">
    <div class="map__static">
        <img src="http://maps.google.com/maps/api/staticmap?center=-33.867487,151.20699&zoom=15&markers=-33.867487,151.20699&size=650x405&sensor=false">
    </div>
</div>

サイトはモバイル ファーストで構築されているため、静的なマップ イメージがデフォルトで読み込まれます。

JS

var mapContainer = $('.map'),
mapStaticContainer = $('.map__static');
mapDynamicContainer = $('<div class="map__dynamic"/>');

// Start Enquire library
enquire.register('screen and (min-width: 40em)', {

    deferSetup: true,

    setup: function setup() {
        mapContainer.prepend(mapDynamicContainer);
        mapDynamicContainer.load('/includes/scripts/adaptive-google-map.php', function() {
            $.getScript('https://maps.googleapis.com/maps/api/js?key=AIzaSyAywjPmf5WvWh_cIn35NwtIk-gYuwu1I2Q&sensor=false&callback=initialize');
        });
    },

    // Not mobile size viewport
    match: function() {
        mapStaticContainer.hide();
        mapDynamicContainer.show();
    },

    // Mobile size viewport
    unmatch: function() { 
        mapStaticContainer.show();
        mapDynamicContainer.hide();
    }

}, true).listen();

これは、 「 /includes/scripts/adaptive-google-map.php load()の内容で、jQuery 経由で AJAX 化されています。

<div id="map_canvas"></div>
<script>
    function initialize() {
    var myLatlng = new google.maps.LatLng(-33.867487,151.20699);
    var myOptions = {
      zoom: 15,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      scrollwheel: false
    }
    map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);
    var marker = new google.maps.Marker({
        position: myLatlng,
        map: map,
        animation: google.maps.Animation.DROP
    });
    var contentString = 
        '<div class="infowindow">'+
            '<div>'+
                    '<p class="flush"><strong>SALES OFFICE:</strong><br>1/16 M. 5<br>Sydney<br>NSW, 83110.</p>'
            '</div>'+
        '</div>'
    ;
    var infowindow = new google.maps.InfoWindow({
        content: contentString
    });
    google.maps.event.addListener(marker, 'click', function() {
        infowindow.open(map,marker);
    });
    // Center Google Maps (V3) on browser resize (http://stackoverflow.com/questions/8792676/center-google-maps-v3-on-browser-resize-responsive)
    var center;
    function calculateCenter() {
        center = map.getCenter();
    }
    google.maps.event.addDomListener(map, 'idle', function() {
        calculateCenter();
    });
    google.maps.event.addDomListener(window, 'resize', function() {
        map.setCenter(center);
    });
    }
</script>

これで問題が解決します。

mapDynamicContainer.show(function () {
    setTimeout(function() {
    initialize(); 
}, 100);
 })

しかし、JS エラーがスローされます: Uncaught ReferenceError: initialize is not defined. ppl によって提案された別の一般的な修正。this: を適用していますgoogle.maps.event.trigger(map, 'resize');が、 after:mapDynamicContainer.show();match()関数に入れると、この JS エラーが発生します: Uncaught ReferenceError: google is not defined

あまり運がない:(

4

1 に答える 1

8

OK、基本的には「サイズ変更」があなたの答えです。

あなたのマッチをこのコードに変更しました:

match: function() {
    mapStaticContainer.hide();
    mapDynamicContainer.show();
    if( typeof(map) != 'undefined'){
        var center = map.getCenter();
        google.maps.event.trigger(map, "resize");
        map.setCenter(center);
    }
 },

そしてそれは働いています。コードに他のものが含まれているかどうかはわかりません。私はあなたが提供するadaptive-google-map.phpのhtml、js、およびコンテンツを使用しましたが、問題なく動作します。

于 2013-02-20T13:17:41.450 に答える