2009-01-30 5 views
9

Tengo una serie de divs en un patrón de encabezado/cuerpo, donde un clic en el encabezado mostrará el cuerpo en cuestión.jQuery: Establecer clic desde el bucle de la matriz

Todo esto ocurre con .click inicializado en la página listo ...

En lugar de hacer esto (que funciona bien, pero es un dolor):

$('#show_fold_ping').click(function(){ ShowArea('#fold_ping') }); 
$('#show_fold_http').click(function(){ ShowArea('#fold_http') }); 
$('#show_fold_smtp').click(function(){ ShowArea('#fold_smtp') }); 
$('#show_fold_pop3').click(function(){ ShowArea('#fold_pop3') }); 
... 

que estoy tratando de hacer esto:

var Areas = ['ping','http', 'smtp', 'pop3']; 

for(var i in Areas){ 
    Area = '#show_fold_'+Areas[i]; 
    $(Area).click(function(){ alert(Area); /* ShowArea(Area); */ }); 
} 

El problema que tengo es que TODOS ellos parecen haberse inicializado en el último. IE: si pop3 es el último, un clic en #show_fold_ [any] alertará '# show_fold_pop3'.

Esto parece que debería ser realmente simple. ¿Me estoy perdiendo algo obvio, o hay un problema con pasar una cadena a jQuery que no conozco?

Editar:

Oye, estos son todos grandes. He leído un poco sobre cierres y funciones autoinvocadas, y (kindasorta) lo entiendo.

Hasta ahora, tengo esto, pero el clic no parece ser vinculante correctamente. El área alertará con el valor correcto, pero sin enlace de clic. ¿Todavía tengo problemas de alcance con Area, o estoy totalmente fuera de lugar?

$(function(){ 

    Areas = ['ping','http', 'smtp', 'pop3', 'imap', 'ftp', 'dns', 'tcp', 'database', 'seo']; 

    for(var i = 0; i < Areas.length; i++){ 
     (function (Area) { 
          alert(Area); 
      $("#show_fold_"+Area).click(function(){ alert('x'); }); 
     })(Areas[i]); 
    } 
}); 
+0

¿No debería $ ("# pliegan _" + Espacio) .click (...) será $ ("# show_fold _" + Espacio) .click (...)? –

+0

¡Sí! Gracias, eso es todo. Tan enfocado en la sintaxis fui semánticamente ciego = o) – Eli

Respuesta

12

Sí, he encontrado este problema con demasiada frecuencia. Area es una variable global ya que no tiene var antes. Además, no use un para ... en constructo.

Pero es posible que todavía tenga un problema similar. Dios sabe cuántos guiones he depurado debido a un error similar. Haciendo lo siguiente garantías de alcance adecuado:

var Areas = ['ping','http', 'smtp', 'pop3']; 

for(var i = 0; i < Areas.length; i++){ 
    (function(area) { 
    $(area).click(function(){ alert(area); /* ShowArea(area); */ }); 
    })(Areas[i]); 
} 
2

Compruebe el alcance de su variable "Área". Básicamente se está asignando una variable global, por lo que en la última iteración, el "Área" se ubica fuera del ciclo.

1

estar seguro de que ha agregado la manipulación después de que el DOM se ha cargado evento click puede incluir este elemento en la cabeza :

var Areas = ['ping','http', 'smtp', 'pop3']; 

$(document).ready(function() { 
    $.each(Areas, function(i, v){ 
     var Area = '#show_fold_' + v; 
     $(Area).click(function() { 
      alert(Area); 
     }); 
    }); 
} 
+0

Es posible que desee editar esa secuencia de comandos. ¿Área de área y áreas = ... + Áreas [i]? – geowa4

Cuestiones relacionadas