用户更改时如何根据 <select> 元素条目添加谷歌地图标记

塔鲁沙因杜瓦拉

我是一名学习Web开发的学生。我想根据选择元素条目添加谷歌地图标记。所以我创建了以下 HTML 代码来创建下拉列表。

<select name="city" class="city" id="city-selection">
    <option selected="selected" value="">Select City</option>
    <option value="City 1">City 1</option>
    <option value="City 2">City 2</option>
    <option value="City 3">City 3</option>
    <option value="City 4">City 4</option>
    <option value="City 5">City 5</option>
    <option value="City 6">City 6</option>
    <option value="City 7">City 7</option>
</select>

为了在每次更改中获取用户输入值,我使用了以下 JavaScript 代码。

var selectElement = document.querySelector('#city-selection');
selectElement.addEventListener('change',function(){
    console.log('Changed '+ event.target.value);
    window.cityName = event.target.value;
})

window.cityName 是我用来从函数中获取用户输入值的全局变量,我的意图是使用它来添加谷歌地图标记。所以我的地图代码如下。

var map;

function initMap() {
    map = new google.maps.Map(document.getElementById("map"), {
        center: { lat: 7.8731, lng: 80.7718 },
        zoom: 7.8,
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        backgroundColor: '#FFF',
        disableDefaultUI: true,
        draggable: false,
        scaleControl:false,
        scrollwheel:false,

        styles:[
        {
            "featureType": "water",
            "elementType": "geometry",
            "stylers": [
                { "visibility": "on" }
            ]
        },
        {
            "featureType": "landscape",
            "stylers": [
                { "visibility": "off" }
            ]
        },
        {
            "featureType": "road",
            "stylers": [
                { "visibility": "off" }
            ]
        },
        {
            "featureType": "administrative",
            "stylers": [
                { "visibility": "off" }
            ]
        },
        {
            "featureType": "poi",
            "stylers": [
                { "visibility": "off" }
            ]
        },
        {
            "featureType": "administrative",
            "stylers": [
                { "visibility": "on" }
            ]
        },
        {
            "elementType": "labels",
            "stylers": [
                { "visibility": "off" }
            ]
        }
        ]
    });

    //colombo marker for city1
    var colomboMark = new google.maps.Marker({
        position:{lat:6.9271, lng:79.8612},
        map:map,
    })

    //pahiyangala marker for city 2
    var pahiyangalaMark = new google.maps.Marker({
        position:{lat:6.6488, lng:80.2163},
        map:map,
    })
}

window.initMap = initMap;

科伦坡标记和 Pahiyangala 标记仅用于检查标记功能并且它们工作正常。

那么,有什么方法可以根据window.cityName值呈现这些标记。我知道我可以使用下面的代码中的 IF 条件来做到这一点。

selectElement.addEventListener('change',function(){
    if(window.cityName == "City 1"){
        var colomboMark = new google.maps.Marker({
            position:{lat:6.9271, lng:79.8612},
            map:map,
        })
    }
    else if{
        var pahiyangalaMark = new google.maps.Marker({
            position:{lat:6.6488, lng:80.2163},
            map:map,
        })
    }
})

我使用了更改事件,因为每次用户更改选择元素选项时我都需要更改全局变量值。问题是当我将上面的条件代码放在谷歌地图标记代码JS部分时,它不起作用。

对此问题的任何迅速回应将不胜感激。

阿布龙修斯教授

无需向window超全局变量发送垃圾邮件 - 但您确实需要一些将City 1, City 2etc etc 名称与实际位置相关联的方法。这可以通过在以 CityName 作为键的对象文字(或 JSON 变量)中分配相关细节来轻松完成。使用该键,您可以查找名称、纬度和 lng 值

下面的代码片段将抛出一个关于google is not defined类型 thing 的错误,但应该给出一个可能如何继续的想法。

let markers = [];

const cities = {
  'City 1': {
    name: 'colombo',
    lat: 6.9271,
    lng: 79.8612
  },
  'City 2': {
    name: 'pahiyangala',
    lat: 6.6488,
    lng: 80.2163
  },
  'City 3': {
    name: 'Geronimo',
    lat: 90,
    lng: 0
  },
  'City 4': {
    name: 'Pocahontas',
    lat: 0,
    lng: 90
  }
};

const addmarker = (lat, lng, name = false) => {
  return new google.maps.Marker({
    title: name,
    name: name,
    position: {
      lat: lat.toFixed(6),
      lng: lng.toFixed(6)
    },
    map: map
  });
};



document.querySelector('select[name="city"]').addEventListener('change', function(e) {
  if (this.value != '' && cities.hasOwnProperty(this.value)) {
  
    // clear previous markers
    markers.forEach(mkr => mkr.setMap(null));
    
    // find the correct city details in cities object
    let obj = cities[this.value];
    
    // add the marker
    markers.push(addmarker(obj.lat, obj.lng, obj.name));

    return true;
  }
  alert('bogus ' + this.value + ' not found')
})
<select name='city' class='city'>
    <option selected hidden disabled>Select City
    <option value='City 1'>City 1
    <option value='City 2'>City 2
    <option value='City 3'>City 3
    <option value='City 4'>City 4
    <option value='City 5'>City 5
    <option value='City 6'>City 6
    <option value='City 7'>City 7
</select>

更新:实现上述代码的完整示例 - 测试和工作。

<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title></title>
        <style>
            #map{
                display:block;
                width:100%;
                height:calc(100vh - 2rem);
                margin:0 auto;
            }
            select[name='city']{
                height:2rem;
                width:100%;
                margin:0 auto;
            }
        </style>
        <script>
            function initMap(){
                let latlng=new google.maps.LatLng( 43.136755, 6.368238 );
                
                const map = new google.maps.Map( document.getElementById('map'), {
                   zoom: 18,
                   scrollwheel: true,
                   center: latlng,
                   mapTypeId: google.maps.MapTypeId.ROADMAP
                });
                
                let markers = [];
                /*
                    depending upon what server you have (ie: PHP)
                    you might generate this list by querying your
                    database... that is usually how it would be 
                    done.
                */
                const cities = {
                  'City 1': {
                    name: 'colombo',
                    lat: 6.9271,
                    lng: 79.8612
                  },
                  'City 2': {
                    name: 'pahiyangala',
                    lat: 6.6488,
                    lng: 80.2163
                  },
                  'City 3': {
                    name: 'Geronimo',
                    lat: 90,
                    lng: 0
                  },
                  'City 4': {
                    name: 'Pocahontas',
                    lat: 0,
                    lng: 90
                  }
                };

                const addmarker = ( lat, lng, name ) => {
                  return new google.maps.Marker({
                    title: name,
                    name: name,
                    position: {
                      lat:lat,
                      lng:lng
                    },
                    map: map
                  });
                };



                document.querySelector('select[name="city"]').addEventListener('change', function(e) {
                  if( this.value != '' && cities.hasOwnProperty( this.value ) ) {
                    markers.forEach( mkr => mkr.setMap( null ) );
                    let obj = cities[ this.value ];
                    
                    markers.push( addmarker( obj.lat, obj.lng, obj.name ) );
                    map.setCenter( new google.maps.LatLng( obj.lat, obj.lng ) );
                    
                    return true;
                  }
                  alert('bogus ' + this.value + ' not found')
                })
            }

        </script>
    </head>
    <body>
        <select name='city' class='city'>
            <option selected hidden disabled>Select City
            <option value='City 1'>City 1
            <option value='City 2'>City 2
            <option value='City 3'>City 3
            <option value='City 4'>City 4
            <option value='City 5'>City 5
            <option value='City 6'>City 6
            <option value='City 7'>City 7
        </select>
        <div id='map'></div>
        <script async defer src="https://maps.googleapis.com/maps/api/js?key=APIKEY&callback=initMap"></script>
    </body>
</html>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何添加谷歌地图标记

如何向谷歌地图标记添加唯一链接

如何更新谷歌地图标记位置?

如何清除谷歌地图标记?

如何使用谷歌地图标记地点

如何在谷歌地图上添加具有不同图标的标记?

如何从我的数据库中添加许多谷歌地图标记?

如何在Android中根据谷歌地图不同的缩放级别调整谷歌地图标记的大小

用户如何可以通过点击添加标记谷歌地图的Android?

当用户单击某些链接时更改谷歌地图标记图标

jQuery-<select>更改时的显示元素

如何让谷歌地图标记在 JavaScript 中再次弹跳

如何在谷歌地图上使用 svg 图标作为标记

如何为谷歌地图标记设置新坐标?

如何计算android中谷歌地图标记的点击次数

如何在谷歌地图标记上显示信息框

如何随机设置谷歌地图标记颜色?

如何在地图上为OpenMapQuest添加地图标记

如何在 javascript 谷歌地图上添加多个标记?

如何添加多个标记角谷歌地图?

如何在谷歌地图上添加多个标记?

如何在谷歌地图中添加来自firestore的标记?

如何在谷歌地图上添加信息窗口和标记

如何在谷歌地图上添加多个标记

如何在Android中将谷歌地图标记颜色更改为灰色

如何在谷歌地图javascript api中将div容器附加到地图标记的顶部

添加新的select标签时如何更改select标签的元素

更改谷歌地图 POIItem 标记

Angular模型更改时更新Select2选定的元素