2016-05-19 116 views
-1

我使用谷歌地圖,我有工作代碼在地圖上顯示標記。我現在想把這個代碼放在一個函數view_maps()中,然後點擊激活這個函數。到目前爲止,我收到了錯誤超出了最大調用堆棧大小getAddress不是函數。這工作,但當view_maps()函數內的代碼我得到這些錯誤。函數內部調用函數

function view_maps() { 
    function marker_map() { 

     var url = "http://example.co.uk/deliveries/map/get_region_orders"; 
     var region = $("ul#regions").children("li[data-active='1']").attr("class"); 

     var data = { 
      region: region 
     }; 

     var obj = {}; 
     var locations = []; 
     var details_array = []; 
     $.ajax({ 
      type: "POST", 
      url: "http://example.co.uk/deliveries/map/get_region_orders", 
      data: data, 
      async: false, 
      success: function(response) { 

       var result = $.parseJSON(response); 

       jQuery.each(result, function(i) { 

        var order_id = result[i].order_id; 
        var customer_name = result[i].customer_name; 
        var address_1 = result[i].address_1; 
        var address_2 = result[i].address_2; 
        var post_code = result[i].post_code; 
        var address = post_code; 

        var details = "<b>Order Number: " + order_id + "</b><br>" + address_1 + "<br>" + address_2 + "<br>" + post_code; 

        details_array.push(details); 
        locations.push(address); 
       }); 

      } 
     }); 

     obj['address'] = locations; 
     obj['details'] = details_array; 


     return (obj); 

    } 

    // delay between geocode requests - at the time of writing, 100 miliseconds seems to work well 
    var delay = 70; 

    // ====== Create map objects ====== 
    var infowindow = new google.maps.InfoWindow(); 
    var latlng = new google.maps.LatLng(53.381021, -2.608138); 
    var mapOptions = { 
     zoom: 9, 
     center: latlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    var geo = new google.maps.Geocoder(); 
    var map = new google.maps.Map(document.getElementById("marker-map"), mapOptions); 
    var bounds = new google.maps.LatLngBounds(); 

    // ====== Geocoding ====== 
    function getAddress(search, count, next) { 
     geo.geocode({ 
      address: search 
     }, function(results, status) { 
      // If that was successful 
      if (status == google.maps.GeocoderStatus.OK) { 
       // Lets assume that the first marker is the one we want 
       var p = results[0].geometry.location; 
       var lat = p.lat(); 
       var lng = p.lng(); 
       // Output the data 
       var msg = 'address="' + search + '" lat=' + lat + ' lng=' + lng + '(delay=' + delay + 'ms)<br>'; 
       document.getElementById("messages").innerHTML += msg; 
       // Create a marker 
       createMarker(search, count, lat, lng); 
      } 
      // ====== Decode the error status ====== 
      else { 
       // === if we were sending the requests to fast, try this one again and increase the delay 
       if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) { 
        nextAddress--; 
        delay++; 
       } else { 
        var reason = "Code " + status; 
        var msg = 'address="' + search + '" error=' + reason + '(delay=' + delay + 'ms)<br>'; 
        //document.getElementById("messages").innerHTML += msg; 
       } 
      } 
      next(); 
     }); 
    } 

    // ======= Function to create a marker 
    function createMarker(add, count, lat, lng) { 
     var contentString = add; 
     var marker = new google.maps.Marker({ 
      position: new google.maps.LatLng(lat, lng), 
      map: map, 
      zIndex: Math.round(latlng.lat() * -100000) << 5 
     }); 

     google.maps.event.addListener(marker, 'click', function() { 
      infowindow.setContent(details_array[count]); 
      //infowindow.setContent(contentString); 
      infowindow.open(map, marker); 
     }); 

     bounds.extend(marker.position); 

    } 

    // ======= An array of locations that we want to Geocode ======== 
    //console.log(marker_map()); 
    var locations = marker_map(); 
    var addresses = locations.address; 
    var details_array = locations.details; 
    // ======= Global variable to remind us what to do next 
    var nextAddress = 0; 

    // ======= Function to call the next Geocode operation when the reply comes back 

    function theNext() { 

     if (nextAddress < addresses.length) { 
      setTimeout('getAddress("' + addresses[nextAddress] + '","' + nextAddress + '",theNext)', delay); 
      nextAddress++; 
     } else { 
      // We're done. Show map bounds 
      map.fitBounds(bounds); 
     } 
    } 

    // ======= Call that function for the first time ======= 
    theNext(); 

} 

我該如何解決?我認爲這與功能範圍有關,因爲getAddress顯然是一個函數。

+2

函數內部函數是一個本地函數..它不能從外部訪問函數.... – Rayon

+0

任何想法如何解決? – user892134

+0

@ user892134我沒有得到,你想要什麼? –

回答

0

你必須用這個改變你的nextNext功能。在setTimeout的

function theNext() { 
    if (nextAddress < addresses.length) { 
    setTimeout(getAddress(addresses[nextAddress],nextAddress,theNext), delay); 
    nextAddress++; 
    } else { 
     // We're done. Show map bounds 
     map.fitBounds(bounds); 
    } 
} 

看變化,我打電話功能不通過字符串(後評估和全球範圍內搜索)

我也爲概念驗證創建一個demo。享受:)

+0

謝謝,但我試過。發生這種情況時,出現錯誤**超出最大調用堆棧大小**。此代碼完全工作,但是當我把它放在一個函數中,我得到這些錯誤? – user892134

+0

你可以用jsbin或者你喜歡的東西來創建一個演示。我們很容易調試 –