2013-07-27 5 views
0

Я создал сценарий, который помещает маркер на карту в зависимости от области, на которую вы нажимаете мышь. После того, как этот маркер будет помещен, когда ваша мышка нависает над маркером, должна появиться инфобокса с адресом места размещения маркера. Тем не менее, инфобокс не появляется, потому что, когда я вызываю «info_text», он возвращает undefined. Я понял, что мне нужно добавить функцию обратного вызова, но я не думаю, что правильно ее реализую. Может ли кто-нибудь помочь мне исправить мой код? Благодаряфункция обратного вызова не работает

Мой код:

var geocoder; 

function initialize() 
{ 

    geocoder = new google.maps.Geocoder(); 
    var event = google.maps.event.addListener; 

    // intializing and creating the map. 
    var mapOptions = { 
    zoom: 4, 
    center: new google.maps.LatLng(-25.363882, 131.044922), 
    mapTypeId: google.maps.MapTypeId.TERRAIN 
    }; 

    var map = new google.maps.Map(document.getElementById('map'), 
     mapOptions); 

    event(map,'click',function(e){ 
    var marker = placeMarker_and_attachMessage(e.latLng,map,count); 
    count = count + 1; 
    }); 

} // end of initalize. 

function placeMarker_and_attachMessage(position,map) 
{ 
    var event = google.maps.event.addListener; 
    var message = ['This', 'is', 'the', 'secret', 'message']; 

    var marker = new google.maps.Marker({ 
     position: position, 
     map: map 
    }); 

    var pos = info_text(position); 
    alert('pos is: ' + pos); 

    var infowindow = new google.maps.InfoWindow({ 
      content: 'hello' 
     }); 

    event(marker,'mouseover',function(){ 
     infowindow.open(map,this); 
    }); 

    event(marker,'mouseout',function(){ 
     infowindow.close(); 
    }); 

} // end of function. 

function info_text(position) 
{ 
    var lat = parseFloat(position.lat()); 
    var lng = parseFloat(position.lng()); 
    alert('lat,lng is: ' + (lat,lng)); 
    var latlng = new google.maps.LatLng(lat,lng); 
    alert('just before geocode'); 
    geocoder.geocode({'latLng': latlng}, function(results, status) 
    { 
     if (status == google.maps.GeocoderStatus.OK) 
     { 
      alert('in info_text If statement'); 
      if(results[1]) 
      { 
       alert('in inner if statement'); 
       var finalResult = myCallback(results[1].formatted_address); 
       return finalResult; 
      } 
      else 
      { 
       alert('no results found'); 
      } 
     } 
     else 
     { 
      alert('could not pinpoint location'); 
     } 

    }); 
} 

function myCallback(loc) 
{ 
    alert('i have a location!'); 
    return loc; 
} 

google.maps.event.addDomListener(window, 'load', initialize); 
+1

Привет. У вас есть небольшое недоразумение о том, как использовать обратные вызовы в асинхронном коде. Могу ли я рекомендовать некоторые [дальнейшее чтение] (http://en.wikipedia.org/wiki/Callback_ (computer_programming))? В результате вы не можете вернуть значение из обратного вызова в том виде, в котором вы пытаетесь. – Jivings

+0

@ Jivings: Спасибо за ответ. Каков наилучший способ вернуть адрес, если мой способ не будет работать? – user1923

+0

Вам необходимо выполнить требуемое действие в функции обратного вызова. – Jivings

ответ

0

Ваша функция info_text не return ничего, так что эта линия:

var pos = info_text(position); 

где pos не определен.

Вы должны включать:

return something; 

в какой-то момент в вашей функции (как вы сделали дальше вниз).

Добавлено Ваша функция myCallback возвращает значение, но где он используется:

myCallback(results[1].formatted_address); 

он не хранит возвращаемое значение в любом месте - это просто отбрасываются.

+0

Я установил myCallback (...) в переменную, а затем вернул ее внутри внутреннего оператора if. поэтому, хотя «неопределенный» pos не появляется, когда я наводил указатель на маркер, не появляется информационное окно ... Любые предложения, почему это происходит с контента -> «привет»? – user1923

+0

Вы не задали 'myCallback()' переменной в вашем опубликованном коде, поэтому я немного потерялся. –

+0

Я предполагаю, что 'geocoder.geocode' является вызовом AJAX, поэтому этот ответ не устранит проблему пользователей. – Jivings

Смежные вопросы