【问题标题】:Google Maps API: open url by clicking on markerGoogle Maps API:通过单击标记打开 url
【发布时间】:2012-02-04 21:33:54
【问题描述】:

我想通过点击使用 Google Maps API 3 的标记打开一个新窗口。

不幸的是,Google Maps API 的示例并不多,我发现了这段代码:

google.maps.event.addListener(marker, 'click', function() {
    window.location.href = marker.url;
});

当我使用循环创建标记时,如何使用它?我尝试了很多方法,但都买不起。

这是我的代码——我让它变得简单而简短:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />

    <style type="text/css">
        html { height: 100% }
        body { height: 100%; margin: 0; padding: 0 }
        #map_canvas { height: 100% }
    </style>

    <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>

    <script type="text/javascript">
    var points = [
        ['name1', 59.9362384705039, 30.19232525792222, 12],
        ['name2', 59.941412822085645, 30.263564729357767, 11],
        ['name3', 59.939177197629455, 30.273554411974955, 10]
    ];

    function setMarkers(map, locations) {
        var shape = {
            coord: [1, 1, 1, 20, 18, 20, 18 , 1],
            type: 'poly'
        };

        for (var i = 0; i < locations.length; i++) {
            var flag = new google.maps.MarkerImage('markers/' + (i + 1) + '.png',
            new google.maps.Size(17, 19),
            new google.maps.Point(0,0),
            new google.maps.Point(0, 19));

            var place = locations[i];
            var myLatLng = new google.maps.LatLng(place[1], place[2]);
            var marker = new google.maps.Marker({
                position: myLatLng,
                map: map,
                icon: flag,
                shape: shape,
                title: place[0],
                zIndex: place[3]
            });
        }
    }

    function initialize() {
        var myOptions = {
            center: new google.maps.LatLng(59.91823239768787, 30.243222856188822),
            zoom: 12,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"),myOptions);
        setMarkers(map, points);
    }
    </script>
</head>

<body onload="initialize()">
    <div id="map_canvas" style="width:50%; height:50%"></div>
</body>
</html>

如何通过点击上面代码的标记打开url?

【问题讨论】:

    标签: javascript google-maps google-maps-api-3 google-maps-markers


    【解决方案1】:

    您可以为每个点添加特定的网址,例如:

    var points = [
        ['name1', 59.9362384705039, 30.19232525792222, 12, 'www.google.com'],
        ['name2', 59.941412822085645, 30.263564729357767, 11, 'www.amazon.com'],
        ['name3', 59.939177197629455, 30.273554411974955, 10, 'www.stackoverflow.com']
    ];
    

    将 url 添加到 for 循环中的标记值:

    var marker = new google.maps.Marker({
        ...
        zIndex: place[3],
        url: place[4]
    });
    

    然后您可以在 for 循环的末尾添加之前:

    google.maps.event.addListener(marker, 'click', function() {
        window.location.href = this.url;
    });
    

    另见example

    【讨论】:

    • 感谢您的回复。这样,每个标记都会打开最后一个 url。我试过这个并没有找到修复它的方法。我检查了您的示例(上面的链接):据我所知:存在同样的问题 - 当您单击标记时,每个标记都有“stackoverflow 链接”。
    • 这真是太棒了!有用。我认为问题出在听众的位置不对。非常感谢。
    • 不客气。如果您对答案感到满意,请将其标记为正确答案。
    • 完成。 (我只是在阅读常见问题解答以了解如何标记正确答案。)谢谢。
    • 我在添加新代码后注意到一个问题:当鼠标悬停在标记上时,没有标记的名称提示。在更改完成之前:有标记的名称“onmouseover”:“name1”、“name2”。 (示例(上面的链接)也有这个问题。)
    【解决方案2】:

    url 不是 Marker 类的对象。但是没有什么能阻止你将它作为属性添加到该类中。我猜你正在看的任何例子也是这样做的。您想为每个标记使用不同的 URL 吗?当你这样做时会发生什么:

    for (var i = 0; i < locations.length; i++) 
    {
        var flag = new google.maps.MarkerImage('markers/' + (i + 1) + '.png',
          new google.maps.Size(17, 19),
          new google.maps.Point(0,0),
          new google.maps.Point(0, 19));
        var place = locations[i];
        var myLatLng = new google.maps.LatLng(place[1], place[2]);
        var marker = new google.maps.Marker({
            position: myLatLng,
            map: map,
            icon: flag,
            shape: shape,
            title: place[0],
            zIndex: place[3],
            url: "/your/url/"
        });
    
        google.maps.event.addListener(marker, 'click', function() {
            window.location.href = this.url;
        });
    }
    

    【讨论】:

    • 感谢您的回复。我之前和今天都试过了。这样,每个标记都具有相同的 url。但这并不是我所需要的。我需要不同的网址。如何将url1设置为marker1,将url2设置为marker2?
    • 它是如何解决的?我有一个类似的项目,每次标记点击都必须在 div 中打开一个函数。
    【解决方案3】:
    google.maps.event.addListener(marker, 'click', (function(marker, i) {
      return function() {
        window.location.href = marker.url;
      }
    })(marker, i));
    

    【讨论】:

    • 您好!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    【解决方案4】:

    如果有人想在不需要 for 循环的单个标记上添加 URL,方法如下:

    if ($('#googleMap').length) {
        var initialize = function() {
            var mapOptions = {
                zoom: 15,
                scrollwheel: false,
                center: new google.maps.LatLng(45.725788, -73.5120818),
                styles: [{
                    stylers: [{
                        saturation: -100
                    }]
                }]
            };
            var map = new google.maps.Map(document.getElementById("googleMap"), mapOptions);
            var marker = new google.maps.Marker({
                position: map.getCenter(),
                animation: google.maps.Animation.BOUNCE,
                icon: 'example-marker.png',
                map: map,
                url: 'https://example.com'
            });
    
            //Add an url to the marker
        google.maps.event.addListener(marker, 'click', function() {
            window.location.href = this.url;
        });
        }
        // Add the map initialize function to the window load function
        google.maps.event.addDomListener(window, "load", initialize);
    }
    

    【讨论】:

      【解决方案5】:
          function loadMarkers(){
                {% for location in object_list %}
                    var point = new google.maps.LatLng({{location.latitude}},{{location.longitude}});
                    var marker = new google.maps.Marker({
                    position: point,
                    map: map,
                    url: {{location.id}},
                });
      
                google.maps.event.addDomListener(marker, 'click', function() {
                    window.location.href = this.url; });
      
                {% endfor %}
      

      【讨论】:

      • 这就是我通过对象循环得到的结果
      【解决方案6】:

      以前的答案对我来说并不好。通过设置标记,我遇到了持续存在的问题。所以我稍微修改了代码。

         <!DOCTYPE html>
         <html>
         <head>
           <meta http-equiv="content-type" content="text/html; charset=ANSI" />
           <title>Google Maps Multiple Markers</title>
           <script src="http://maps.google.com/maps/api/js?sensor=false"
            type="text/javascript"></script>
         </head>
         <body>
           <div id="map" style="width: 1500px; height: 1000px;"></div>
      
           <script type="text/javascript">
             var locations = [
               ['Goettingen',  51.54128040000001,  9.915803500000038, 'http://www.google.de'],
               ['Kassel', 51.31271139999999,  9.479746100000057,0, 'http://www.stackoverflow.com'],
               ['Witzenhausen', 51.33996819999999,  9.855564299999969,0, 'www.http://developer.mozilla.org.de']
      
       ];
      
      var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 10,
       center: new google.maps.LatLng(51.54376, 9.910419999999931),
       mapTypeId: google.maps.MapTypeId.ROADMAP
      });
      
      var infowindow = new google.maps.InfoWindow();
      
      var marker, i;
      
      for (i = 0; i < locations.length; i++) {
        marker = new google.maps.Marker({
         position: new google.maps.LatLng(locations[i][1], locations[i][2]),
         map: map,
         url: locations[i][4]
        });
      
       google.maps.event.addListener(marker, 'mouseover', (function(marker, i) {
         return function() {
           infowindow.setContent(locations[i][0]);
           infowindow.open(map, marker);
         }
       })(marker, i));
      
            google.maps.event.addListener(marker, 'click', (function(marker, i) {
         return function() {
           infowindow.setContent(locations[i][0]);
           infowindow.open(map, marker);
           window.location.href = this.url;
         }
       })(marker, i));
      
          }
      
           </script>
         </body>
         </html>
      

      这种方法对我有用! 您可以从您的 Datebase 创建 Google Maps 路由链接,以将其用作交互式路由图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 2014-05-10
        • 1970-01-01
        • 2012-03-07
        • 2011-12-15
        • 2011-02-13
        • 2012-06-03
        相关资源
        最近更新 更多