2012-03-09 6 views
7

Tengo un problema bastante extraño al tratar de armar una pantalla algo dinámica de Google Maps. Tengo superposiciones en un mapa que me gustaría llamar una función cuando hago clic. Al principio yo tenía todo lo codificado, así que tenía una función para cada superposición de la siguiente manera:¿Cómo puedo pasar un parámetro a una función sin que se ejecute de inmediato?

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

Esto funcionó sin ningún problema, pero luego me hizo toda la página más dinámica, así que decidí hacer una función que pasaría una identificación y luego mostrar en función de eso, que es la forma en que creo que debería haber sido configurado originalmente de todos modos. Alteré el código para ver más como esto:

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

La función funcionó, pero el problema es que se llama inmediatamente al cargar la página. Después de investigar, descubrí que cuando llamas a una función con los paréntesis, se llama inmediatamente a esa función y luego se hace referencia a su valor de retorno. source

Así que ahora estoy un poco atascado en cómo exactamente pasar la identificación a la función sin tener que llamar a la función de inmediato. He encontrado algunas maneras chulescas de hacerlo que podrían funcionar, pero siento que esto no debería ser algo que tenga que hackear juntos ...

Respuesta

13

Tener showArea devolver una función que funcione con la identificación.

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

La función de regresar cierra sobre id lo que sigue para hacer referencia a ella, y se pasa a addListener para ser utilizado como el controlador.


Alternativamente, usted podría inline la función que llama a showArea(1) ...

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

Esto funciona porque estás codificando la 1. Si fuera una variable que podría cambiar, como en un bucle, usaría el primer ejemplo.

+0

Ambos funcionan como un encanto. Muchas gracias! –

+0

@MattMcClure: De nada. –

+0

Gracias @squint! Devolver la función resolvió mi problema de la llamada ejecutando la función en la etapa de inicialización y no en la etapa de ejecución. –

Cuestiones relacionadas