2012-03-09 11 views
7

Mam pewien dziwny problem z próbą ułożenia nieco dynamicznego ekranu w Mapach Google. Mam nakładki na mapie, którą chciałbym nazwać funkcją po kliknięciu. Początkowo miałem wszystko ciężko kodowane, więc miałem funkcję dla każdego nakładki jak ten:Jak mogę przekazać parametr do funkcji bez uruchamiania go od razu?

google.maps.event.addListener(southEast, 'click', showSouth); 
function showSouth() { 
    // do stuff 
} 

To działało bez problemu, ale potem zrobiłem cała strona bardziej dynamiczny, więc postanowiłem zrobić jedną funkcję, która minie identyfikator, a następnie wyświetlaj w oparciu o to, i tak uważam, że i tak powinien był zostać utworzony pierwotnie. Zmieniłem kod, aby wyglądał mniej więcej tak:

google.maps.event.addListener(southEast, 'click', showArea(1)); 
function showArea(id) { 
    // do stuff based on that id 
} 

Funkcja zadziałała, ale problemem jest to, że zostanie wywołana natychmiast po wczytaniu strony. Po przeprowadzeniu badań nauczyłem się, że gdy wywołujesz funkcję z nawiasami, funkcja ta jest natychmiast wywoływana, a następnie zwracana jest jej wartość zwracana. source

Więc teraz trochę utknąłem, jak dokładnie przejść przez przekazywanie tego identyfikatora do funkcji bez wywoływania funkcji natychmiast. Znalazłem kilka hakerów, które mogą działać, ale czuję, że to nie powinno być coś, co muszę zhakować razem ...

Odpowiedz

13

Mieć showArea zwrócić funkcję, która działa z id.

function showArea(id) { 
    return function() { 
     // do stuff with id 
    }; 
} 

Zwrócona Zamyka się id tak dalej się odniesienie i jest przekazywane do addListener być stosowane jako uchwytu.


Alternatywnie, można po prostu wbudować funkcję, która wywołuje showArea(1) ...

google.maps.event.addListener(southEast, 'click', function() { showArea(1); }); 
function showArea(id) { 
    // do stuff based on that id 
} 

To będzie działać, ponieważ jesteś hardcoding się 1. Jeśli była to zmienna, która mogłaby się zmienić, jak w pętli, użyłbyś pierwszego przykładu.

+0

Oba działają jak czar. Dziękuję bardzo! –

+0

@MattMcClure: Nie ma za co. –

+0

Dzięki @squint! Zwrócenie funkcji rozwiązało mój problem z wywołaniem funkcji na etapie inicjalizacji, a nie na etapie wykonywania. –

Powiązane problemy