【问题标题】:How to filter markers without reloading the map如何在不重新加载地图的情况下过滤标记
【发布时间】:2020-08-17 05:20:54
【问题描述】:

我有一张显示 MySQL 数据库信息的地图。我修改了 initmap() 函数来过滤它。但是,每次过滤标记时,地图都会重新加载,我希望在不重新加载地图的情况下过滤它们。

我认为解决方案是将创建地图的函数与生成标记的函数分开。但我无法做到。

感谢您的帮助!

<head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <style>
        #map {
            height: 75%;
        }

        /* Optional: Makes the sample page fill the window. */
        html,
        body {
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>

<html>

<body>
    <div id="map"></div>
    <input onkeyup="initMap('input', null);table('input')" id="input" type="text" name="valueToSearch">

            <script>


                function initMap(ElemId, rowId) {
                    var map = new google.maps.Map(document.getElementById('map'), {
                        center: new google.maps.LatLng(48.8566, 2.3522),
                        zoom: 12
                    });
                    var filter = "";
                    var table = "";
                    var tablefilter = "";

                    var infoWindow = new google.maps.InfoWindow;

                    function parseToHTML(string) {
                        string = string.replace(/&quot;/g, "\"");
                        string = string.replace(/&#39;/g, "\'");
                        string = string.replace(/&lt;/g, "<");
                        string = string.replace(/&gt;/g, ">");
                        string = string.replace(/&amp;/g, "&");
                        string = string.replace(/&uml;/g, "ö");
                        return (string);
                    }





                    // Change this depending on the name of your PHP or XML file
                    downloadUrl('../xml.php', function(data) {
                        var xml = data.responseXML;
                        var markers = xml.documentElement.getElementsByTagName('marker');
                        Array.prototype.forEach.call(markers, function(markerElem) {
                            var id = markerElem.getAttribute('id');
                            var name = markerElem.getAttribute('name');
                            name = parseToHTML(name);
                            var address = markerElem.getAttribute('address');
                            var type = markerElem.getAttribute('type');
                            var architect1 = markerElem.getAttribute('architect1');
                            var architect2 = markerElem.getAttribute('architect2');
                            var architect3 = markerElem.getAttribute('architect3');
                            var buildingEnd = markerElem.getAttribute('building_end');
                            var street = markerElem.getAttribute('street');
                            var postcode = markerElem.getAttribute('postcode');
                            var city = markerElem.getAttribute('city');

                            var point = new google.maps.LatLng(
                                parseFloat(markerElem.getAttribute('lat')),
                                parseFloat(markerElem.getAttribute('lng')));

                            var infowincontent = document.createElement('div');
                            var strong = document.createElement('strong');
                            strong.textContent = name
                            infowincontent.appendChild(strong);
                            infowincontent.appendChild(document.createElement('br'));

                            var text = document.createElement('text');
                            text.textContent = address + ' ' + name;
                            infowincontent.appendChild(text);
                            var icon = customLabel[type] || {};

                            var marker = new google.maps.Marker({
                                map: map,
                                position: point,
                                label: icon.label,
                                title: name,

                            });
                            if (rowId != null) {
                                var rowIndex = document.getElementById(rowId).id;
                                console.log(rowIndex);
                                if (rowIndex == id) {
                                    infoWindow.setContent(infowincontent);
                                    infoWindow.open(map, marker);
                                }
                            }

                            if (ElemId != null) {
                                var input = document.getElementById(ElemId);
                                var filter = input.value.toUpperCase();
                                filter = filter.normalize("NFD").replace(/[\u0300-\u036f]/g, "");

                                function escaping(strData) {
                                    strData = strData.toUpperCase();
                                    strData = strData.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
                                    return strData;
                                }
                                var nameFilter = escaping(name);
                                var archiFilter = escaping(architect1);
                                var archi2Filter = escaping(architect2);
                                var archi3Filter = escaping(architect3);
                                var typeFilter = escaping(type);
                                var buildingEndFilter = escaping(buildingEnd);
                                var streetFilter = escaping(street);
                                var postcodeFilter = escaping(postcode);
                                var cityFilter = escaping(city);

                                var testName = nameFilter.includes(filter);
                                var testArchi1 = archiFilter.includes(filter);
                                var testArchi2 = archi2Filter.includes(filter);
                                var testArchi3 = archi3Filter.includes(filter);
                                var testType = typeFilter.includes(filter);
                                var testBuildingEndFilter = buildingEndFilter.includes(filter);
                                var testStreet = streetFilter.includes(filter);
                                var testPostcode = postcodeFilter.includes(filter);
                                var testCity = cityFilter.includes(filter);

                                if (
                                    testName == true ||
                                    testArchi1 == true ||
                                    testArchi2 == true ||
                                    testArchi3 == true ||
                                    testType == true ||
                                    testBuildingEndFilter == true ||
                                    testStreet == true ||
                                    testPostcode == true ||
                                    testCity == true


                                ) {
                                    marker.setVisible(true);
                                } else {
                                    marker.setVisible(false);
                                }

                            }

                            marker.addListener('click', function() {
                                infoWindow.setContent(infowincontent);
                                infoWindow.open(map, marker);

                            });
                        });

                    });
                };

                function downloadUrl(url, callback) {
                    var request = window.ActiveXObject ?
                        new ActiveXObject('Microsoft.XMLHTTP') :
                        new XMLHttpRequest;

                    request.onreadystatechange = function() {
                        if (request.readyState == 4) {
                            request.onreadystatechange = doNothing;
                            callback(request, request.status);
                        }
                    };

                    request.open('GET', url, true);
                    request.send(null);
                }

                function doNothing() {}
            </script>

            <script async defer src="https://maps.googleapis.com/maps/api/js?key=APIKEY">
            </script>
</body>
</html>

【问题讨论】:

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


    【解决方案1】:

    每次在输入字段中输入时,您都会重新加载地图。为避免这种情况,您可以使用两个不同的函数,initMap 用于在页面刷新/地图 API 加载时创建地图,initInput 用于在文本输入更改时修改地图、添加或过滤标记等。查看以下代码以获得指导:

    <input onkeyup="initInput('input', null);table('input')" id="input" type="text" name="valueToSearch">
    
    <script>
      var map;
    
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: new google.maps.LatLng(48.8566, 2.3522),
          zoom: 12
        });
      }
    
      function initInput(ElemId, rowId) {
        var filter = "";
        var table = "";
        var tablefilter = "";
        ...
      }
    </script>
    
    <script async defer src="https://maps.googleapis.com/maps/api/js?callback=initMap">
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的帮助!事实上,现在我可以在不重新加载地图的情况下加载标记。然而,过滤器不再起作用。我认为这是因为每次调用“inittInput”函数时,它都会重新创建新的标记。我试图为过滤器设置一个 fid 函数,但它只修改最后一个标记。你有什么想法吗?再次感谢您的帮助
    • 您好,您可以提供一个 jsfiddle、codesandbox 或 stackblitz,以便我重现您的报告吗?
    • link 我无法创建第三个函数,因为在从我的 XML 文件中提取数据以在一个函数中使用它时,我找不到创建具有坐标和名称的数组的方法可以过滤它。谢谢你:)
    • 我终于找到了办法; jsfiddle感谢您的帮助
    • 嘿,很高兴听到!抱歉,我没有足够的时间来帮助您解决后续问题,但很高兴现在已经解决了:D
    猜你喜欢
    • 1970-01-01
    • 2019-05-24
    • 2019-01-08
    • 2014-10-22
    • 2011-05-22
    • 1970-01-01
    • 2019-10-08
    • 2020-03-23
    • 2011-11-09
    相关资源
    最近更新 更多