2012-12-06 32 views
6

Hiện tại chương trình đang hoạt động, nhưng giao diện rất khó chịu vì chức năng alert() tôi đang sử dụng chức năng getData() !! và khi tôi xóa dòng này khỏi hàm getData() thì toàn bộ chương trình sẽ bị lỗi !! Tôi không biết vấn đề là gì? liều bất cứ ai có một ý tưởng tốt hơn để làm một quá trình như vậy?Cách lấy khoảng cách từ một vị trí đến các vị trí khác nhau bằng một lần nhấp bằng API bản đồ của Google?

Chương trình tôi đang cố gắng thực hiện ở đây nhằm giúp người dùng tìm nhà hàng trong vòng 50km từ địa chỉ hiện tại của họ, tôi đã thu thập nhiều địa chỉ vị trí khác nhau và ghi lại nó trong cơ sở dữ liệu.

initialize() chức năng được gọi khi nội dung HTML được tải, trong dòng đầu tiên của nội dung HTML, dữ liệu nhà hàng sẽ được trích xuất từ ​​MySQL bằng cách sử dụng PHP sẽ in dữ liệu vào các mảng JavaScript jsres_add, jsres_id, jsres_name và jsnu để tôi có thể sử dụng chúng trong mã JavaScript. * Xin lưu ý rằng mã JavaScript như hình dưới đây được tách ra trong .js nộp

var geocoder, location1, location2, gDir, oMap, jsnu, arraynu, address2; 
jsres_add = new Array(); 
jsres_id = new Array(); 
jsres_name = new Array(); 

function initialize() { 
    geocoder = new GClientGeocoder(); 
    gDir = new GDirections(); 
    GEvent.addListener(gDir, "load", function() { 
     var drivingDistanceMiles = gDir.getDistance().meters/1609.344; 
     var drivingDistanceKilometers = gDir.getDistance().meters/1000; 
     if (drivingDistanceKilometers < 50){ 
      // function to save search result within 50km into database using ajax 
      saveSearchResult(jsres_id[arraynu],jsres_name[arraynu],drivingDistanceKilometers); 
     } 
    }); 
} 

function getData() { 
    emptytable(); //function to empty search result table using ajax 
    //jsnu is the number of the restaurants data found in database 
    for (var ii = 0; ii < jsnu; ii++) { 
     arraynu = ii; 
     address2 = jsres_add[ii]; 
     showLocation(); 
     alert("done!"); 
    } 
    showResults(); //function to print out the search result from database into html body using ajax 
} 

function showLocation() { 
geocoder.getLocations(document.forms[0].address1.value, function (response) { 
    if (!response || response.Status.code != 200){ 
     alert("Sorry, we were unable to geocode your address"); 
    }else{ 
     location1 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0], address: response.Placemark[0].address}; 
     geocoder.getLocations(address2, function (response) { 
      if (!response || response.Status.code != 200){ 
       alert("Sorry, we were unable to geocode the second address"); 
      }else{ 
       location2 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0], address: response.Placemark[0].address}; 
       gDir.load('from: ' + location1.address + ' to: ' + location2.address); 
      } 
     }); 
    } 
}); 
} 

Trả lời

3

Nếu sự hiện diện của alert() chức năng làm cho mã công việc tôi đoán đó là một vấn đề liên quan đến thời gian, đặc biệt là dường như address2 của bạn bị ghi đè trước khi nhận được phản hồi từ dịch vụ bộ mã hóa địa lý.

[EDIT]

Sau khi bạn thiết lập các jsfiddle Tôi đã kiểm tra mã của bạn chặt chẽ hơn và đã nhận nó để làm việc:

http://jsfiddle.net/zuYXS/16/

address2 đã thực sự ghi đè, nhưng đây không phải là vấn đề duy nhất , trên thực tế tất cả các biến bạn đang sử dụng đều là toàn cầu. Đặc biệt, tôi đã phải tạo một thể hiện của GDirections cho mỗi yêu cầu bạn đã thực hiện (chia sẻ một đã ghi đè kết quả đầu tiên trước khi nó được hiển thị).

Để hiểu lý do mã của bạn không hoạt động, tôi khuyên bạn nên tìm kiếm và nghiên cứu một số tài liệu về các cuộc gọi phương thức không đồng bộ.

Cũng giống như quy tắc chung của ngón tay cái (cho Javascript và cho lập trình nói chung) cố gắng tránh đặt biến trong phạm vi toàn cầu, nhưng hạn chế tuổi thọ của chúng ở phạm vi nhỏ nhất có thể, điều này sẽ giúp ích theo nhiều cách: giảm cơ hội biến tên xung đột, trong khi cải thiện hiệu suất (biến sẽ chỉ tồn tại khi cần thiết) và khả năng đọc mã của bạn (sẽ dễ dàng hơn để theo dõi các giá trị).

+0

Thật không may, nó không hoạt động !! nhưng như bạn đã nói đó là một vấn đề thời gian, tôi không biết nếu nó có thể sử dụng một số loại trình xử lý sự kiện addlistener? –

+1

Nếu bạn có thể cài đặt http://jsfiddle.net/ chúng tôi sẽ giúp bạn dễ dàng hơn. Bạn có thể? –

+0

Tôi đã rút ngắn chương trình đơn giản nhất có thể; vì vậy mọi người có thể thấy vấn đề dễ dàng, tôi đã thử nghiệm chương trình trên máy tính xách tay của tôi trước khi chia sẻ nó trên http://www.jsfiddle.net và nó đã hoạt động, ở đây là http: // jsfiddle.net/ibrahim_zahrani/zuYXS/6/ –

2

Dịch vụ chỉ đường không đồng bộ, bạn không thể trả lại bất kỳ thứ gì từ nó, bạn cần sử dụng dữ liệu được trả về từ máy chủ trong thói quen gọi lại.

Bạn đang sử dụng cú pháp API Google Maps v2; API đó không được dùng nữa và sẽ không còn được hỗ trợ sau ngày 19 tháng 5 năm 2013. Việc phát triển mới với phiên bản API đó không được khuyến khích mạnh mẽ.

viết lại mã của bạn để sử dụng the Google Maps API v3

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