2010-05-11 27 views
8

Và điều đó đang nói điều gì đó. Điều này dựa trên mẫu Google Maps cho Chỉ đường trong API Maps v3.Hành vi JavaScript điên rồ nhất mà tôi từng thấy

<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> 

Xem "cảnh báo" ('booga booga') "trong đó?

Với điều đó tại chỗ, tất cả đều hoạt động tuyệt vời. Nhận xét rằng, và bắt đầu var là không xác định khi chúng ta nhấn dòng để xác định yêu cầu var.

Tôi đã phát hiện ra điều này khi tôi xóa cảnh báo mà tôi đặt vào đó để hiển thị cho tôi giá trị của khởi đầu var và nó ngừng hoạt động. Nếu tôi yêu cầu nó cảnh báo cho tôi giá trị của var start, nó cho tôi biết nó không được xác định, NHƯNG nó có giá trị hợp lệ (và chính xác!) Khi chúng ta định nghĩa var request một vài dòng sau.

Tôi nghi ngờ đó là vấn đề về thời gian - chẳng hạn như một thứ không đồng bộ có thời gian để hoàn thành ở chế độ nền trong thời điểm tôi phải bỏ qua cảnh báo. Bất kỳ suy nghĩ về công việc xung quanh?

+7

+1 nguyên nhân khiến tôi lol – user318747

+0

Heh. Tôi phải nói với bạn, khi tôi thay đổi nó từ nói với tôi về biến trong câu hỏi để nói cho tôi một số chuỗi ngẫu nhiên và nó VẪN thất bại mà không có nó ... Whew. –

Trả lời

16

Điều bạn cho là đúng navigator.geolocation.getCurrentPosition() là cuộc gọi không đồng bộ đã hoàn tất trong khi bạn loại bỏ cảnh báo đó. Để khắc phục điều này, bạn cần tiếp tục công việc của mình từ hoặc trong chức năng gọi lại. Để làm điều đó, hãy sắp xếp lại mã của bạn để xảy ra khi hoàn thành, như sau:

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(); 
    } 
} 
+0

Điều đó đã xảy ra. Cảm ơn bạn!! –

7

"Thứ gì đó không đồng bộ" là lệnh gọi hàm getCurrentPosition. Cảnh báo mất một thời gian, để cuộc gọi đó có thể hoàn thành và gọi hàm gọi lại đặt giá trị "bắt đầu".

Bạn có thể thử di chuyển toàn bộ mốt mã bắt đầu từ nơi bạn xác định "yêu cầu" vào cuộc gọi lại trên getCurrentPosition. Điều đó sẽ trì hoãn nó cho đến khi "bắt đầu" chắc chắn được đặt thành giá trị có thể sử dụng.

chỉnh sửa có như Nick hiển thị trong ví dụ của anh ấy.

+0

Đúng. Làm việc như một nhà vô địch. Cảm ơn! –

Các vấn đề liên quan