Самое сумасшедшее поведение JavaScript я когда-либо видел

И это говорит что-то. Это основано на образце Google Maps для Направлений в API v3 Карт.

<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Google Directions</title> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 
var directionDisplay;
var directionsService = new google.maps.DirectionsService();
var map;


function initialize() {
    directionsDisplay = new google.maps.DirectionsRenderer();

    var myOptions = {
      zoom:7,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }

    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    directionsDisplay.setMap(map);
    directionsDisplay.setPanel(document.getElementById("directionsPanel"));
}

function render() {
    var start;

    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
          start = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
        }, function() {
          handleNoGeolocation(browserSupportFlag);
        });
      } else {
        // Browser doesn't support Geolocation
        handleNoGeolocation();
    }

    alert("booga booga");


    var end = '<?= $_REQUEST['destination'] ?>';
    var request = {
        origin:start, 
        destination:end,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
    };
    directionsService.route(request, function(response, status) {
      if (status == google.maps.DirectionsStatus.OK) {
        directionsDisplay.setDirections(response);
      }
    });
}

</script> 
</head> 
<body style="margin:0px; padding:0px;" onload="initialize()"> 
<div><div id="map_canvas" style="float:left;width:70%; height:100%"></div> 
<div id="directionsPanel" style="float:right;width:30%;height 100%"></div> 
<script type="text/javascript">render();</script>
</body> 
</html>

Посмотрите что "предупреждение ('booga booga')" там?

С этим на месте, это все фантастические работы. Прокомментируйте это, и запуск var не определен, когда мы поражаем строку для определения запроса var.

Я обнаружил это, когда я удалил предупреждение, я поместил там, чтобы показать мне, значение var запускается, и это вышло из работы. Если я ДЕЙСТВИТЕЛЬНО прошу, чтобы это предупредило меня, чтобы значение var запустилось, это говорит мне, что это не определено, НО это имеет допустимое (и точный!) оценивают, когда мы определяем запрос var несколько строк позже.

Я подозреваю, что это - проблема синхронизации - как асинхронное, которое что-то имеет время для завершения в фоновом режиме в момент, это берет меня для отклонения предупреждения. Какие-либо мысли об обходных решениях?

8
задан Grace Note 13 May 2010 в 17:43
поделиться

2 ответа

То, что вы считаете правильным navigator.geolocation.getCurrentPosition () - это асинхронный вызов, завершенный, пока вы отклоняете это предупреждение. Чтобы исправить это, вам нужно продолжить работу либо из функции обратного вызова, либо в ней. Для этого измените код так, чтобы он появлялся после его завершения, например:

function render() {
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
          var start = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
          var end = '<?= $_REQUEST['destination'] ?>';
          var request = {
              origin:start, 
              destination:end,
              travelMode: google.maps.DirectionsTravelMode.DRIVING
          };
          directionsService.route(request, function(response, status) {
            if (status == google.maps.DirectionsStatus.OK) {
              directionsDisplay.setDirections(response);
            }
          });
        }, function() {
          handleNoGeolocation(browserSupportFlag);
        });
      } else {
        // Browser doesn't support Geolocation
        handleNoGeolocation();
    }
}
16
ответ дан 5 December 2019 в 07:10
поделиться

"Асинхронное что-то" - это вызов getCurrentPosition. Оповещение занимает некоторое время, поэтому этот вызов может завершиться и вызвать обратный вызов, который устанавливает значение "start".

Вы можете попробовать переместить всю пачку кода, начиная с того места, где вы определяете "request", в обратный вызов getCurrentPosition. Это задержит его до тех пор, пока "start" не будет определенно установлен в пригодное для использования значение.

edit да, как Ник показывает в своем примере.

7
ответ дан 5 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: