2009-08-02 15 views
6

Tôi đang làm việc trên trang tìm nạp mã với httpObject Javascript và sử dụng nó để cập nhật hai phần tử trên trang - một bản đồ google và DIV liệt kê những điểm mà điểm đánh dấu .Tự động thêm người nghe vào Google Maps Markers

Bit đó hoạt động tốt. Vấn đề là khi tôi tạo ra các dấu hiệu, tôi làm như vậy thông qua một vòng lặp for, và tôi thêm người nghe vào điểm đánh dấu trong mỗi vòng lặp. Sau đó, khi tôi kiểm tra trang, tôi thấy điều tương tự xảy ra với mọi điểm đánh dấu.

Di chuột qua điểm đánh dấu sẽ thay đổi màu đường viền của bit tương ứng của DIV. Thay vào đó, mỗi điểm đánh dấu thay đổi đường viền của bit cuối cùng. Dường như mỗi lần tôi thêm người nghe, tôi cũng ghi đè lên người nghe của các điểm đánh dấu đã thêm trước đây.

Tôi hiểu rằng điều này là để làm với API Google Maps giữ lại danh tính của điểm đánh dấu ngay cả khi bạn tạo một điểm mới trong Javascript. Những gì tôi không nhận được nó như thế nào để có được xung quanh nó - tôi đã cố gắng tạo ra một mảng bên ngoài vòng lặp, và thay đổi

var newMarker = new GMarker(newLatLng); 

với newMarker [đếm] = new GMarker (newLatLng);

nhưng vẫn không hoạt động.

Giúp tôi, StackOverflow. Bạn là hy vọng duy nhất của tôi. :)

Edit: Một ít mã hơn

for (count=0;count<=LatArray.length;count++) 
{ 
    thisLat = LatArray[count]; 
    thisLong = LongArray[count]; 
    thisHTML = HTMLArray[count]; 
    newLatLng = new GLatLng(thisLat, thisLong, true); 

    if (mapBounds.containsLatLng(newLatLng)) 
    { 
     //alert(count); 
     var dinnerNumber = "dinner_"+count; 
     newMarkers[count] = new GMarker(newLatLng); 
     map.addOverlay(newMarkers[count]); 
     GEvent.addListener(newMarkers[count],'mouseover',function(){document.getElementById(dinnerNumber).style.borderColor = '#000000'; 
    }); 
}// for 
+1

1 cho tham khảo Star Wars (phi rác một) – karim79

+0

Chúng tôi có thể lấy mẫu mã lớn hơn không? Rất khó để biết vấn đề là gì. – karim79

Trả lời

6

Đóng vấn đề - tất cả những người nghe chia sẻ biến dinnerNumber cùng. Hãy thử điều này:

GEvent.addListener(newMarkers[count], 'mouseover', (function(dinnerNumber){ return function(){document.getElementById(dinnerNumber).style.borderColor = '#000000';}; })(dinnerNumber)); 

Bằng cách này, mỗi người nghe được tạo với bản sao đóng riêng của bữa tốiNumber.

+0

Cảm ơn Justin! Tôi không biết đầu mối gì đang diễn ra ở đó, nhưng nó hoạt động. Tôi sẽ kéo nó ra xa và xem tôi có thể hiểu được nó không, nhưng bây giờ bạn đã giải quyết được vấn đề của tôi! –

+1

Kiểm tra http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/ để có giải thích thực sự tốt về đóng cửa và "sự cố vòng lặp khét tiếng". –

1

Bạn phải đọc kỹ

GEvent.addListener(newMarkers[count], 'mouseover', 
     (function(dinnerNumber) 
      { return function() 
       { document.getElementById(dinnerNumber).style.borderColor = '#000000';};   
      } 
    )(dinnerNumber) 
); 

bạn bỏ lỡ một();

tham số 3 thứ là (function (var) {function return() {// những gì bạn muốn wirh var;};}) (var)