在谷歌地图示例中为 Ajax 调用制作一个 JavaScript 闭包

craft a javascript closure for ajax call in google map example

本文关键字:一个 闭包 JavaScript 谷歌地图 调用 Ajax      更新时间:2023-09-26

我有这个简化的代码,可以创建一个谷歌地图,并允许我将文本注入地图InfoWindow气泡。

但问题来了。目前函数 fnGetNewTextForInfoWindow() 的任务是微不足道的。 但是,如果我更改fnGetNewTextForInfoWindow()的内容以调用jquery .ajax查询,这需要几百毫秒。这会导致数据延迟。 我认为需要一个"闭包"函数,但在保持调用函数的位置的上下文时遇到问题。需要指导。谢谢

<!DOCTYPE html>
<html>
<head>
<style>
#map-canvas, #side-bar {        
    height: 500px;
    width: 600px;        
}
</style>
<script src="http://maps.googleapis.com/maps/api/js" type="text/javascript"></script>           
<script src="jquery.js" type="text/javascript"></script> 
<script type="text/javascript">
//  "use strict";
    // variable to hold a map
    var map;
    // variable to hold current active InfoWindow
    var activeInfoWindow ;      
    // ------------------------------------------------------------------ //
    // initialize function      
    // ------------------------------------------------------------------ //
      function initialize() {
        // map options  
        var mapOptions = {
          zoom : 10,
          draggable: true,
          center : new google.maps.LatLng(44.9600, -93.1000),
          mapTypeId : google.maps.MapTypeId.ROADMAP
        };
        // create map in div called map-canvas using map options defined above
        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        // define two Google Map LatLng objects representing geographic points
        var stPaul          = new google.maps.LatLng(44.9522,-93.0892);
        var minneapolis     = new google.maps.LatLng(44.9792,-93.2662);
        // place two markers
        fnPlaceMarkers(stPaul,"St Paul");
        fnPlaceMarkers(minneapolis,"Minneapolis");          
      }
    // -------------------------------------------------------------- //
    // create markers on the map
    // ------------------------------------------------------------- //
    function fnPlaceMarkers(myLocation,myCityName){
        var marker = new google.maps.Marker({
            position : myLocation
        });
        // Renders the marker on the specified map
        marker.setMap(map); 
        // create an InfoWindow
        var infoWnd = new google.maps.InfoWindow();         
        // add content to your InfoWindow
        infoWnd.setContent('<div class="scrollFix">' + 'Welcome to ' +  myCityName + '</div>');
        // add listener on InfoWindow - close last infoWindow  before opening new one 
        google.maps.event.addListener(marker, 'click', function() {
        //Close active window if exists - [one might expect this to be default behaviour no?]               
        if(activeInfoWindow != null) activeInfoWindow.close();
        // get latest text
        var newText = fnGetNewTextForInfoWindow();
        infoWnd.setContent(newText);
        // Open InfoWindow
        infoWnd.open(map, marker, newText);
        // Store new open InfoWindow in global variable
        activeInfoWindow = infoWnd;
    });                             
            }
    function fnGetNewTextForInfoWindow(){
        var newText = $('#idSomeNewText').val();
        return newText;
    }
    // ---------------------------------------------------------- //
    // initial load
    // -----------------------------------------------------------//       
    google.maps.event.addDomListener(window, 'load', initialize);
</script>
Enter Some text to insert in marker:
    <input id='idSomeNewText' type="text" name="firstname" value="test value">  
<br/>  <br/>  
    <div id="map-canvas"></div>
<br/>
<br/>
</body>
</html>

-----添加:fnGetNewTextForInfoWindow() 看起来像这样...

function fnGetNewTextForInfoWindow() {
    $.ajax({
        type: "POST",
        dataType : 'json',
        data: { key1: "value"} ,                
        url: "myProgram",       
        success: function(data) {           
            // I need this value to display in infoWindow
            var newText =  new google.maps.LatLng(markerData[i]['newStatus'],  markerData[i]['newOwner']);
        },  // end success
        error: function (jqXHR, textStatus, errorThrown) { 
            // something bad happened
        }
    });  // end ajax
};

---------编辑 - 根据贸泽的修订

// -------------------------------------------------------------- //
    // create markers on the map
    // ------------------------------------------------------------- //
    function fnPlaceMarkers(myLocation,myCityName){
        var marker = new google.maps.Marker({
            position : myLocation
        });
        // Renders the marker on the specified map
        marker.setMap(map); 
        // create an InfoWindow
        var infoWnd = new google.maps.InfoWindow();         
        // add content to your InfoWindow
        infoWnd.setContent('<div class="scrollFix">' + 'Welcome to ' +  myCityName + '</div>');
        // add listener on InfoWindow - close last infoWindow  before opening new one 
        google.maps.event.addListener(marker, 'click', function() {
        //Close active window if exists - [one might expect this to be default behaviour no?]               
        if(activeInfoWindow != null) activeInfoWindow.close();
        // get latest text
        // var newText = fnGetNewTextForInfoWindow();
        // infoWnd.setContent(newText);
         // pass infoWnd
         fnGetNewTextForInfoWindow(infoWnd);
        // Open InfoWindow
        // infoWnd.open(map, marker, newText);
        // Store new open InfoWindow in global variable
        //activeInfoWindow = infoWnd;
    });                             
}
    // ---------------------------------------------------------- //
    // 
    // -----------------------------------------------------------//       
    function fnGetNewTextForInfoWindow(infoWindow){
    var infoWnd = infoWindow
    //$.ajax( "data.xml" )
    $.ajax( "example.php" )
    .done(function(data) {
         var newText = data;                    // data from the jQuery ajax call
         infoWnd.setContent(newText);           // set the content
         infoWnd.open(map, marker, newText);    // 
        })
    }

如果你有一个jQuery Ajax调用(你需要自己填写它)。这只是一个基本的(基本的)Ajax调用:

function fnGetNewTextForInfoWindow(infoWindow){
    var infoWnd = infoWindow
    $.ajax( "example.php" )
    .done(function(data) {
         var newText = data; //data from the jQuery ajax call
         infoWnd.setContent(newText);  //set the content
         infoWnd.open(map, marker, newText);
    })
}

要调用您的调用,请替换以下行:

    var newText = fnGetNewTextForInfoWindow();
    infoWnd.setContent(newText);

    fnGetNewTextForInfoWindow(infoWnd);

这是通过将对象infoWnd发送到 fnGetNewTextForInfoWindow 函数来实现的。我们在同一作用域中设置 Ajax 调用,因此我们可以在 done 方法中重用 infoWnd 对象。