谷歌地图仅在 USB 调试时加载

Posted

技术标签:

【中文标题】谷歌地图仅在 USB 调试时加载【英文标题】:Google maps loads only when USB debugging 【发布时间】:2019-07-05 07:06:09 【问题描述】:

我正在使用 Google Maps API 在某些位置制作带有自定义图钉的地图。该地图在台式机上运行良好,但在我的 android 平板电脑上无法加载 - 我在这两种情况下都使用 Chrome 对其进行测试。令我困惑的是,当我尝试 USB 调试页面时,地图开始加载;但是,一旦我关闭页面的开发人员工具并重新加载页面,地图就会再次停止加载。

快速的 Google 不会显示任何内容。当我调试时,控制台输出中没有任何内容。

这是我的一些代码:

<script src="https://maps.googleapis.com/maps/api/js?key=APIKEY"></script>
<script src="js/handlebars.js"></script>
<script src="js/custom-marker.js"></script>
<script src="js/unresolved-map.js"></script>

这里是 custom-marker.js:

function CustomMarker(latlng, map, args) 
    this.latlng = latlng;
    this.pos = latlng;
    this.args = args;
    this.setMap(map);


CustomMarker.prototype = new google.maps.OverlayView();

CustomMarker.prototype.draw = function() 
    var self = this;
    var div = this.div;

    if (!div) 
        div = this.div = document.createElement('div');
        div.innerhtml = this.args.html;

        div.className = 'marker';
        div.style.position = 'absolute';

        if (typeof(self.args.marker_id) !== 'undefined') 
            div.dataset.marker_id = self.args.marker_id;
        

        google.maps.event.addDomListener(div, "click", function(event) 
            google.maps.event.trigger(self, "click");
        );

        var panes = this.getPanes();
        panes.overlayImage.appendChild(div);
    

    var point = this.getProjection().fromLatLngToDivPixel(this.latlng);

    if (point) 
        div.style.left = point.x -100 + 'px';
        div.style.top = point.y - 200 + 'px';
    
;

CustomMarker.prototype.remove = function() 
    if (this.div) 
        this.div.parentNode.removeChild(this.div);
        this.div = null;
    
;

CustomMarker.prototype.getPosition = function() 
    return this.latlng;
;

这里是 unresolved-map.js:

$(function() 
    window.markers = [];

    google.maps.event.addDomListener(window, 'load', initialize);

    function initialize() 
        var currentCenter = new google.maps.LatLng(43.85639, 25.97083);
        var mapOptions = 
            zoom: 14,
            center: currentCenter,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        ;

        var map = new google.maps.Map(document.getElementById('signals-map'), mapOptions);

        for (var i = 0; i < Laravel.obektiSignals.length; i++) 
            var obekt = Laravel.obektiSignals[i];

            // compile handlebars template
            var source = document.getElementById("marker-template").innerHTML;
            var template = Handlebars.compile(source);
            var html = template(obekt);

            var markerPosition = new google.maps.LatLng(obekt.latitude, obekt.longitude);

            window.markers.push(new CustomMarker(markerPosition, map, html: html, marker_id: obekt['id']));

            setTimeout(function() 
                resizeSignalWrappers();
                zindex();
            , 300);
        
    

    function zindex() 
        var markers = $('.marker');

        for (var i = 0; i < markers.length; i++)
        
            var marker = markers.eq(i);

            marker.on('click', function() 
                $(this).css('z-index', starting_zindex);
                starting_zindex++;
            );
        
    

    function resizeSignalWrappers() 
        var markerSignals = $('.marker-signals');

        for (var i = 0; i < markerSignals.length; i++) 
            var markerSignal = markerSignals.eq(i);
            var name = markerSignal.parent().find('.obekt-name');
            var nameHeight = name.height();
            var newHeight = 170 - (nameHeight + 5);

            markerSignal.height(newHeight + 'px');
        
    
);

请注意,同样的事情发生在两个单独的页面上,这里是另一个页面的代码,它只有一个 pin,它不是自定义 pin:

$(function() 
    var map;
    var marker;

    $('#address').keydown(function(event) 
        if (event.keyCode == 13)
        
            addressToMap();
        
    );

    $(window).keydown(function(event)
        if (event.keyCode == 13) 
            event.preventDefault();
            return false;
        
    );

    google.maps.event.addDomListener(window, 'load', initMap);

    function initMap() 
        var currentLatLng;

        var latitude = $('#latitude').val();
        var longitude = $('#longitude').val();

        if (latitude !== '' && longitude !== '')
        
            currentLatLng = new google.maps.LatLng(latitude, longitude);
        
        else
        
            currentLatLng = new google.maps.LatLng(43.85639, 25.97083);
        

        var myOptions = 
            zoom: $('.obekti-form').hasClass('zoom') ? 16 : 11,
            center: currentLatLng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        ;

        map = new google.maps.Map(document.getElementById("map-canvas"), myOptions);

        marker = new google.maps.Marker(
            draggable: true,
            position: currentLatLng,
            map: map,
            title: "Selected location"
        );

        google.maps.event.addListener(map, 'click', function(event) 
            marker.setPosition(event.latLng);

            var latitude = event.latLng.lat();
            var longitude = event.latLng.lng();

            $('#latitude').val(latitude);
            $('#longitude').val(longitude);
            $('#latlng').val(latitude + ',' + longitude);
        );
    

    function addressToMap()
    
        var address = $.trim($('#address').val());

        if (address == '')
        
            return;
        

        $.post('https://maps.googleapis.com/maps/api/geocode/json?key=' + GOOGLE_MAPS_API_KEY + '&address=' + address, function(data) 
            if (data.status !== 'ZERO_RESULTS')
            
                var lat = data.results[0].geometry.location.lat;
                var lng = data.results[0].geometry.location.lng;

                map.setCenter(lat: lat, lng: lng);

                if (data.results[0].geometry.viewport)
                
                    // fit to the bounds of the searched location
                    var southwestLatLng = new google.maps.LatLng(data.results[0].geometry.viewport.southwest.lat, data.results[0].geometry.viewport.southwest.lng);
                    var northeastLatLng = new google.maps.LatLng(data.results[0].geometry.viewport.northeast.lat, data.results[0].geometry.viewport.northeast.lng);

                    var bounds = new google.maps.LatLngBounds(southwestLatLng, northeastLatLng);

                    map.fitBounds(bounds);
                

                marker.setPosition(new google.maps.LatLng(lat, lng));

                $('#latitude').val(lat);
                $('#longitude').val(lng);
                $('#latlng').val(lat + ',' + lng);
            
        );
    
);

请注意,我正在从数据库中获取一些数据(Laravel.obektiSignals),以便将其显示为引脚。另请注意,我正在使用 Handlebars.js 编译 html 模板。

EDIT1:刚刚在桌面 Firefox 中测试过,它可以工作,但在我清除缓存后只有一次,再次加载时它会停止加载控制台中没有错误。

【问题讨论】:

【参考方案1】:

删除包裹在代码周围的 jQuery 解决了问题,或者换句话说,这段代码:

$(function() 

);

这很有趣,但我认为这很难找到。

【讨论】:

以上是关于谷歌地图仅在 USB 调试时加载的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图 + javascript 仅在警报被编码时正确呈现

如何通过仅在用户滚动到特定部分时调用它来减少谷歌地图 API 命中数

应用程序在谷歌地图加载时崩溃,错误“libc.so abort 160 flutter”

谷歌地图 ios sdk 信息窗口仅在 2 次点击时出现

Google地图图块仅在触摸设备上触发dragend时加载

加载地图失败。在片段上联系 Google 服务器时出错