javascript - Google Map API v3 - Ajax(Javascript + Jquery)GET 问题

标签 javascript jquery xml get

我正在尝试制作 map 加载标记 - 从 xml 文件中提取。目前它完美地做到了这一点。不过,我还希望 map 根据超链接传递的月份重新加载新标记。

当通过超链接更改“global_month”变量时,将触发 ajax 请求,并且应根据稍后传递给“if”语句的日期用新数据重新填充“data_array”。但是,它重用了“data_array”内容,并且不会用新数据填充它。

我尝试通过“change_date_range”函数中的“global_month = []”重置“global_month”,但是 - 数组似乎没有重新填充。我花了 3 个小时试图找出我哪里出错了,但找不到。有人可以帮忙吗?还有更有效的方法吗?

非常感谢您抽出时间!

///////////////////////////////////////////////

            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="utf-8">  
                <script src="jquery-1.7.1.min.js" type="text/javascript"></script>
                <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
                <script>
                    $(document).ready(function()
                    {
                        $.ajax({
                            type: "GET",
                            url: "driving_test_centers.xml",
                            dataType: "xml",
                            success: parseXml
                        });
                    }); 
                    var global_month = 6;

                    function refetch()
                    {
                        $.ajax({
                            type: "GET",
                            url: "driving_test_centers.xml",
                            dataType: "xml",
                            success: parseXml
                        });
                    };          



                var data_array = [];
                var empty_holder;
                var empty_month;
                var info_date;
                var address1;
                var address2;
                var town;
                var county;
                var postcode;
                var lat;
                var lon;
                var male_pass_percentage1;
                var male_pass_percentage;
                var female_pass_percentage1;
                var female_pass_percentage;
                var the_new_date;
                var infowindow;
                var xml_contents;

                function parseXml(xml)
                {
                    $(xml).find("test_center").each(function()    // look for all of the test centers
                    {

                        center_name = $(this).attr('name');
                        address1 = $(this).find('address1').text();
                        address2 = $(this).find('address2').text();
                        town = $(this).find('town').text();
                        county = $(this).find('county').text();
                        postcode = $(this).find('postcode').text();
                        lat = $(this).find('lat').text();
                        lon = $(this).find('lon').text();

                        $(this).find("date_info").each(function()
                        {

                            info_date = $(this).attr('date');
                            empty_month = $(this).find('month').text();
                            male_pass_percentage = $(this).find('male');
                            male_pass_percentage = male_pass_percentage.find('pass_percentage').text();
                            female_pass_percentage = $(this).find('female');
                            female_pass_percentage = female_pass_percentage.find('pass_percentage').text();


                            if(empty_month == global_month){
                                data_array.push([lat,lon,center_name,info_date,male_pass_percentage,female_pass_percentage]);
                            }
                        });


                    });

                }


                function change_date_range(the_new_date){
                    global_month = the_new_date;
                    refetch();
                    init();
                };  




                </script>
                <script>


                function init() {


                    var options = {  
                        zoom: 5,
                        center: new google.maps.LatLng(55.3781, -3.4360),  
                        mapTypeId: google.maps.MapTypeId.ROADMAP  
                    };
                    var places;
                    places = null;  

                    var map = new google.maps.Map(document.getElementById('map'), options);
                    var bounds = new google.maps.LatLngBounds();

                    var places = data_array;
                    var temp_location;


                    for (var i = 0; i < places.length; i++) {

                        temp_location = new google.maps.LatLng(places[i][0], places[i][1])

                        // Adding the markers
                        var marker = new google.maps.Marker({
                            position: temp_location, 
                            map: map,
                            title: places[i][2]
                        });

                        // Wrapping the event listener inside an anonymous function 
                        // that we immediately invoke and passes the variable i to.
                        (function(i, marker) {

                            // Creating the event listener. It now has access to the values of
                            // i and marker as they were during its creation
                            google.maps.event.addListener(marker, 'click', function() {

                                // Check to see if we already have an InfoWindow  
                                if (!infowindow) {
                                    infowindow = new google.maps.InfoWindow();
                                }

                                // Setting the content of the InfoWindow
                                infowindow.setContent(places[i][2] + "<br />" + global_month + "<br />" + places[i][3] + "<br /><br />Male: " + places[i][4] + "%<br />Female: " + places[i][5] + "%");

                                // Tying the InfoWindow to the marker 
                                infowindow.open(map, marker);

                            });

                        })(i, marker);

                        // Extending the bounds object with each LatLng
                        bounds.extend(temp_location);

                    }

                    // Adjusting the map to new bounding box
                    map.fitBounds(bounds)

                };



                </script>
            </head>
            <body onload="init()">

                    <div id="map" style="width:800px;height:600px"></div>

                    <a href="javascript:change_date_range(7)">click</a>
            </body>
            </html>

//////////////////////////////////////////////////////////////////////////////////////////////////////

XML文件(一小部分):

http://tinypaste.com/198889bb

最佳答案

您没有清除 data_array 数组...您只是继续向其添加内容。为什么不将 data_array = []; 添加到 parseXml 函数的开头

编辑:您还应该清除已经放置的标记...使这变得简单的一个好方法是,当您添加标记时,将它们保存在一个数组中,然后您可以循环遍历它,设置的 map 属性每个都为空:

for (x=0;x<markers.length;x++) {markers[x].setMap(null);}

关于javascript - Google Map API v3 - Ajax(Javascript + Jquery)GET 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754258/

相关文章:

javascript - Typemoq 和 Angular-cli 不能一起工作

javascript - 从 ajax 运行 javascript

javascript - Phonegap 应用程序 : Shadows on clicking a button

javascript - 主体加载后未调用函数

jquery - 如何使用单个 CSS 使表单在所有设备上居中

java - 如何使用java为XML中的节点生成Xpath?

javascript - 禁用复选框上的 jQuery 单击事件未触发

javascript - 在字符串中的一些随机数字后面添加空格

java - 使用 XPath Java 解析 SOAP 响应

Android 屏幕兼容性——为不同的屏幕尺寸提供不同的布局是否至关重要?