Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] onclick se ejecuta automaticamente en la creacion

Estas en el tema de onclick se ejecuta automaticamente en la creacion en el foro de Javascript en Foros del Web. saben porque al crear las imagenes ingresa a este metodo inmeditamente habilitando la ventana flotante sin haber dado click?. Ademas, una vez cerrada la ventana ...
  #1 (permalink)  
Antiguo 14/04/2016, 21:31
 
Fecha de Ingreso: marzo-2014
Mensajes: 41
Antigüedad: 10 años, 1 mes
Puntos: 0
onclick se ejecuta automaticamente en la creacion

saben porque al crear las imagenes ingresa a este metodo inmeditamente habilitando la ventana flotante sin haber dado click?.
Ademas, una vez cerrada la ventana no vuelve a suceder el evento, es como que si no se le hubiese asignado ese evento a las imagenes.

Código Javascript:
Ver original
  1. //el parametro datos es el nombre del archivo .json, en este caso "datosLibros.json"
  2. function cargarLibros(datos){
  3.     loadJSON(cargarLibros,datos);
  4.     var libros=JSON.parse(datos);
  5.     var ref=document.getElementById("librosInternacionales");
  6.     var s="";
  7.     for(var i=0;i<libros.length;i++){
  8.        
  9.         var div=document.createElement("div");
  10.         div.className="divImg";
  11.         div.id="foto"+i;
  12.         ref.appendChild(div);
  13.        
  14.         var imagen=document.createElement("img");
  15.         imagen.className="fotos";
  16.         imagen.src="imagenes/libro"+i+".jpg";
  17.         imagen.alt="imagen_libro";
  18.         imagen.onclick=clickImg(libros,""+i); //En esta linea es donde salta al metodo clickImg sin haber dado click
  19.        
  20.        
  21.         div.appendChild(imagen);
  22.        
  23.     }
  24. }
  25.  
  26.  
  27. //----------------Este es el metodo que se ejecuta al dar click en una imagen, el que quiero agregar como atributo on click a cada imagen----------------
  28.  
  29. function clickImg(datos,numFoto){
  30.    
  31.     var libros=datos;
  32.     var a=document.getElementById("ventana-flotante");
  33.     a.style.visibility='visible';
  34.            
  35.     var v=document.getElementById("contenedor");
  36.            
  37.     var obj=new Object();
  38.     s=obj.dato1=libros[numFoto].titulo;
  39.     v.innerHTML=s;
  40.    
  41. }
  42.  
  43.  
  44.  
  45.  
  46.  
  47. function loadJSON(callback, jsonFile) {
  48.     var xobj = new XMLHttpRequest();
  49.     xobj.overrideMimeType("application/json");
  50.  
  51.     xobj.open('GET', jsonFile, true);
  52.  
  53.     xobj.onreadystatechange = function () {
  54.         if (xobj.readyState === 4 && xobj.status === 200) {
  55.             callback(xobj.responseText);
  56.         }
  57.     };
  58.     xobj.send(null);
  59. }

Última edición por newb; 14/04/2016 a las 22:04
  #2 (permalink)  
Antiguo 15/04/2016, 02:21
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: onclick se ejecuta automaticamente en la creacion

Porque no se declara de esa manera. Al hacerlo de esa manera automaticamente la funcion se ejecuta.

Tenes 4 maneras de hacerlo
Código Javascript:
Ver original
  1. imagen.onclick= function() { clickImg(libros,""+i); };
Código Javascript:
Ver original
  1. imagen.onclick=clickImg; // no podrias pasar argumentos ("libros,""+i")
Código Javascript:
Ver original
  1. imagen.addEventListener("click", clickImg); // no podrias pasar argumentos
Código Javascript:
Ver original
  1. imagen.addEventListener("click", function() {
  2.     clickImg(libros,""+i);
  3. });
  #3 (permalink)  
Antiguo 15/04/2016, 03:03
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: onclick se ejecuta automaticamente en la creacion

Cita:
Iniciado por Fernand0 Ver Mensaje
Porque no se declara de esa manera. Al hacerlo de esa manera automaticamente la funcion se ejecuta.

Tenes 4 maneras de hacerlo
Código Javascript:
Ver original
  1. imagen.onclick= function() { clickImg(libros,""+i); };
Código Javascript:
Ver original
  1. imagen.addEventListener("click", function() {
  2.     clickImg(libros,""+i);
  3. });
Esas dos formas son incorrectas. La variable i dentro de las funciones está referenciando una variable definida en un entorno donde es índice de un bucle.Por lo tanto, cuando se ejecute ese callback, independientemente de la imagen sobre la que se haga click, la variable "i" siempre valdrá libros.length.
Si quieres hacerlo así, tienes que hacer que la variable "i" referencie a una variable definida en un contexto diferente.Por ejemplo:
Código Javascript:
Ver original
  1. imagen.onclick= (function(i) { return function() { clickImg(libros,""+i); }})(i);
Eso es una función autollamada, que retorna una función callback, que es la que se asigna al evento.
Lo importante es que la variable "i" de esa función callback, ya no referencia a la variable "i" del bucle.Referencia al parámetro "i" de la función autollamada, por lo que tiene su propia "copia", y no sufre del problema anterior.
  #4 (permalink)  
Antiguo 15/04/2016, 04:27
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: onclick se ejecuta automaticamente en la creacion

Yo que sepa las variables primitivas no referencian a nada, pero bueno.

Aca te dejo newb: jsFiddle1, jsFiddle2
  #5 (permalink)  
Antiguo 15/04/2016, 06:12
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: onclick se ejecuta automaticamente en la creacion

Cita:
Iniciado por Fernand0 Ver Mensaje
Yo que sepa las variables primitivas no referencian a nada, pero bueno.

Aca te dejo newb: jsFiddle1, jsFiddle2
Pues entonces, no sabes mucho.Las variables están definidas en un entorno, y cuando se produce un closure javascript, esas variables se resuelven en un entorno determinado.Una variable siempre es una etiqueta que hace referencia a un valor que está definido en un entorno.

En tus fiddles, pones sólo 1 div.Prueba con 3 divs.Te dejo el fiddle:https://jsfiddle.net/Lo5b79co/.
Haz click en cualquier div.
Qué valor de i ves?

Ahora prueba este
https://jsfiddle.net/byg0Lhrg/2/
Qué valor de i ves?

Última edición por dashtrash; 15/04/2016 a las 06:23
  #6 (permalink)  
Antiguo 15/04/2016, 06:24
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: onclick se ejecuta automaticamente en la creacion

Tenes razon, te felicito.

Ahora anda a terapia para resolver tu complejo de inferioridad..
Totalmente innecesaria la forma de dirigirse asi..
  #7 (permalink)  
Antiguo 15/04/2016, 06:44
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: onclick se ejecuta automaticamente en la creacion

Cita:
Iniciado por Fernand0 Ver Mensaje
Tenes razon, te felicito.

Ahora anda a terapia para resolver tu complejo de inferioridad..
Totalmente innecesaria la forma de dirigirse asi..
Si no sabes demasiado, al menos, no seas condescendiente ("Que yo sepa...pero bueno..."), justo antes de volver a dar un mal consejo.Recibirás mejores formas de dirigirse a tí.
Y, sobre todo, cuando se te explica por qué lo que dices falla, antes de seguir dirigiendo mal a una persona publicando código, podrías molestarte en comprobar si es cierto lo que se te ha dicho.
  #8 (permalink)  
Antiguo 15/04/2016, 06:59
Avatar de Fernand0  
Fecha de Ingreso: septiembre-2005
Ubicación: Buenos Aires
Mensajes: 610
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: onclick se ejecuta automaticamente en la creacion

Te propongo TRASH.. que como Colaborador, te remitas a COLABORAR y no a buscar pelea con otro usuario... No tenes idea de que connotacion tenia mi oracion, si queres buscar pelea o estas mal de la cabeza anda a otro lado o tene la decencia de sacarte el titulo de COLABORADOR.
Ni siquiera me dirigi a vos, asi que como voy a ser condescendiente...?

Hacete ver o madura, no se cuantos años tendras como para andar buscando pelea un viernes a la mañana...

Suerte a todos.
  #9 (permalink)  
Antiguo 15/04/2016, 10:23
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: onclick se ejecuta automaticamente en la creacion

Buf...Buscar pelea..Que si decencia, que si mal de la cabeza, que si madure....
Es mucho más sencillo:
- Das una respuesta equivocada.
- Se te corrige.
- Insistes.
- Se te demuestra
- Te enfadas.

"No sabes mucho" no es un insulto.Es un hecho, demostrado porque el error que cometes es usual en personas con poca experiencia en javascript, ergo, "no sabes mucho".Pero, en vez de leer mi respuesta, asimilarla, y probarla, cosa que cualquier persona madura debería hacer, sobre todo si es técnico, no sólo lo ignoras, sino que, respuesta a respuesta, vas subiendo el nivel de falta de respeto.
Lo que hago como colaborador, es , entre otras cosas, corregir respuestas incorrectas.

Etiquetas: html, json
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 01:24.