Foros del Web » Programando para Internet » Jquery »

Error en evento click sobre capas generadas con AJAX

Estas en el tema de Error en evento click sobre capas generadas con AJAX en el foro de Jquery en Foros del Web. Veamos, hace un tiempo hice una pregunta similar, pero ahora quiero reordenar funciones y parámetros y me encuentro con problemas. Os explico. Tengo este código: ...
  #1 (permalink)  
Antiguo 21/08/2015, 04:38
 
Fecha de Ingreso: septiembre-2003
Mensajes: 140
Antigüedad: 20 años, 7 meses
Puntos: 2
Error en evento click sobre capas generadas con AJAX

Veamos, hace un tiempo hice una pregunta similar, pero ahora quiero reordenar funciones y parámetros y me encuentro con problemas. Os explico.

Tengo este código:

Código Javascript:
Ver original
  1. filas = function() {
  2.     $.ajax({
  3.         type: "POST",
  4.         url: "generarFilas.php",
  5.         success: function(respuesta){
  6.             var datos = eval('('+respuesta+')');
  7.             for(var i in datos) {
  8.                 $("#contenedor").append("<div id="+datos[i].id+" class='fila'></div>");
  9.                 $("#"+datos[i].idruta+".fila").on("click", detalles(datos[i]));
  10.             }
  11.         }
  12.     });
  13. }
  14.  
  15. detalles = function(datos) {
  16.     console.log(datos);
  17. }

Vamos, que lo que quiero es generar filas. Y luego un evento clic que al hacer clic en la fila se vean los detalles.

La fila se ve como se tiene que ver, y la función detalles hace lo que tiene que hacer, pero la función detalles se autoejecuta al cargar la página en vez de ejecutarse al hacer clic en la fila. No sé si está mal ubicado el evento clic o si tengo más errores.

¿Me podéis ayudar?
Un saludo.
  #2 (permalink)  
Antiguo 21/08/2015, 08:39
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en evento click sobre capas generadas con AJAX

Se ejecuta por la forma en la que la colocaste. Al ser una llamada de retorno y querer pasarle un argumento, lo correcto sería hacerlo de esta manera:

Código Javascript:
Ver original
  1. $("#"+datos[i].idruta+".fila").on("click", function(){
  2.     detalles(datos[i])
  3. });

Sin embargo, al ser contenido dinámico, lo más adecuado es que delegues el evento de la siguiente manera:

Código Javascript:
Ver original
  1. $("#contenedor").on("click", ".fila", function(){
  2.     //Aquí ejecutas tus instrucciones
  3. });

Obviamente, esto debe de ir fuera del bucle. Incluso puede ir por fuera del método $.ajax(). Noto también que usas la función eval(), la cual no se recomienda su uso por medidas de seguridad, razón por la cual te desaconsejo su uso.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 21/08/2015, 08:54
 
Fecha de Ingreso: septiembre-2003
Mensajes: 140
Antigüedad: 20 años, 7 meses
Puntos: 2
Respuesta: Error en evento click sobre capas generadas con AJAX

Lo de eval lo uso para convertir el JSON, pero puedo acceder sin problemas sin usarlo. No lo sabía. Gracias. He estado mirando eso que pones y lo de delegar el evento clic, y funciona también. Gracias otra vez.

Otra cosa. Si tengo que sacar el evento click del for, ¿como paso datos[i] directamente? He hecho que en vez de pasar datos[i], con DOM y javascript capturo los elementos que me hacen falta y funciona, ¿pero no sería más comodo pasar los datos del for directamente a la función?
  #4 (permalink)  
Antiguo 21/08/2015, 09:13
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en evento click sobre capas generadas con AJAX

Hay muchas formas en las que puedes hacer el envío del argumento a la función.

Una de ellas consiste en establecer dicho valor en un atributo personalizado y luego tomarlo mediante el método .data(), el cual te sirve tanto para tomar como para establecer el valor.

Código Javascript:
Ver original
  1. //Para tomar el valor
  2. $("identificador").data("atributo");
  3.  
  4. //Para establecer el valor
  5. $("identificador").data("atributo", "valor");

Y en cuanto a lo que mencionas sobre convertir la respuesta al formato JSON, te bastaba con añadir el atributo dataType al método $.ajax() y asignarle el valor "json"; incluso tienes como opciones el uso de los métodos $.getJSON() y JSON.parse().

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 21/08/2015, 10:30
 
Fecha de Ingreso: septiembre-2003
Mensajes: 140
Antigüedad: 20 años, 7 meses
Puntos: 2
Respuesta: Error en evento click sobre capas generadas con AJAX

Interesante lo de .data. No lo conocía. Veo que se me escapan cosas de jQuery.

getJSON es para hacer llamadas con GET, y quiero hacerlo con POST. No e importa usar la función $.ajax

La respuesta del metodo success la formateo en PHP con JSON y al recibirla puedo acceder como respuesta.id en vez de respuesta["id"]. Por eso no pasa nada.

Voy a probar lo de data, a ver si puedo pasarlo como argumento de la función.
  #6 (permalink)  
Antiguo 21/08/2015, 11:09
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Error en evento click sobre capas generadas con AJAX

En ese caso, puedes usar el método $.parseJSON() o JSON.parse() o el atributo dataType, como te lo indiqué en la anterior respuesta, pero evitar usar la función eval(). No es seguro.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: ajax, capas, evento
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:02.