Я пытаюсь встроить карту google с маркерами на свою веб-страницу. Но я получаю неопределенное предупреждающее сообщение, если я использую следующий код
var infowindow = null; var geocoder; $(document).ready(function () { initialize(); }); function codeAddress(address) { geocoder = new google.maps.Geocoder(); geocoder.geocode( { 'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { //alert(results[0].geometry.location); return (results[0].geometry.location); } }); } function initialize() { default_location = codeAddress("<?php echo $location;?>"); alert(default_location); }
Вместо этого Если я выполняю предупреждение с помощью функции codeAdress, как показано ниже, он правильно показывает широту и долготу.
var infowindow = null; var geocoder; $(document).ready(function () { initialize(); }); function codeAddress(address) { geocoder = new google.maps.Geocoder(); geocoder.geocode( { 'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { alert(results[0].geometry.location); } }); } function initialize() { codeAddress("<?php echo $location;?>"); }
Может ли кто-нибудь определить, в чем проблема? Я новичок в javascripts
Вызов геокодера является асинхронным, что означает, что требуется некоторое время для возврата и не следует последовательного порядка, как написано. Это также означает, что в первом бите функция заканчивается до того, как она return (results[0].geometry.location)
к вашему return (results[0].geometry.location)
. Так что alert
имеет ничего общего.
Помимо ввода инструкций в запросе geocode
, вы можете написать шаблон обратного вызова, чтобы отделить логику сценария. Обратный вызов, который передает местоположение в качестве параметра, выполняется, когда вызов geocode
выполняется успешно.
var infowindow = null; var geocoder = new google.maps.Geocoder(); $(document).ready(function () { initialize(); }); function codeAddress(address, callback) { geocoder.geocode( { 'address': address}, function(results, status) { if (status == google.maps.GeocoderStatus.OK) { callback(results[0].geometry.location); } }); } function initialize() { codeAddress("Chicago, IL", function(default_location) { var map = new google.maps.Map(document.getElementById("map_canvas"), { center: default_location, zoom: 3, mapTypeId: google.maps.MapTypeId.ROADMAP }); locations = ["Los Angeles", "Davis", "Truth or Consequences", "Ann Arbor", "Massachusetts"]; for (var i = 0; i < locations.length; i++) { codeAddress(locations[i], function(latLng) { new google.maps.Marker({map:map, position:latLng}); }); } }); }
Геокод не возвращает результат немедленно. Вот почему вы не получаете ничего в первой версии своего кода. Поэтому, если вы хотите что-то сделать с результатом геокодирования, вы должны сделать это в функции обратного вызова, как во второй версии вашего кода.
Ваш
return (results[0].geography.location);
Верните только значение вложенной функции, а не функцию codeAddress. Может быть, если вы скажете нам, что вы пытаетесь сделать, мы можем помочь.