Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Comprobar click de multiples elementos

Estas en el tema de Comprobar click de multiples elementos en el foro de Javascript en Foros del Web. Hola a todos, estoy aprendiendo javascript por mi cuenta y me he topado con un problema al que, por más que busco, no le hallo ...
  #1 (permalink)  
Antiguo 22/01/2017, 12:09
 
Fecha de Ingreso: septiembre-2006
Mensajes: 22
Antigüedad: 17 años, 7 meses
Puntos: 0
Comprobar click de multiples elementos

Hola a todos, estoy aprendiendo javascript por mi cuenta y me he topado con un problema al que, por más que busco, no le hallo solución.

Tengo un slider de imágenes con transiciones, en el cual cambio el nombre de la ruta de imagen dependiendo del número de bullet en el que se haya hecho click.

Ej. 'click' en bullet 3 = Cambiar imagen a slider_img3.png

[URL="http://codepen.io/GhostOrder/pen/xgZOao"]Aquí[/URL] dejo el codepen de mi slider:

Hasta aquí todo bien.

El problema viene cuando tengo que añadir mas sliders en la misma pagina pero cada grupo de imágenes tiene un prefijo distinto en su nombre, por ejemplo:

Slider1 : slider1_img1.png, slider1_img2.png, slider1_img3.png
Slider2 : slider2_img1.png, slider2_img2.png, slider2_img3.png

Siendo que la única diferencia en mi función para cambiar imágenes es el nombre de la ruta de imagen, me gustaría usar una sola función que, mediante un condicional, compruebe en que slider se ha hecho clic y dependiendo del resultado cambie el nombre de la ruta de imagen.

No se si me explico bien.

Este fue mi intento y obviamente fallo:

Código javascript:
Ver original
  1. var aboutSectionListItems = document.getElementsByClassName('carousel-index')[0].children; // Lista de bullets del slider 'about'
  2. var helpSectionListItems = document.getElementsByClassName('carousel-index')[1].children; // Lista de bullets del slider 'help'
  3. var imageChanger = document.getElementById('image-container').getElementsByTagName('img'); // elemento <img>
  4. var bulletList = [aboutSectionListItems, helpSectionListItems]; //Array con todos los bullets
  5. var bulletNumber; //Variable con la que se cambia el nombre de la imagen, dependiendo en que número de bullet se haya hecho click.
  6.  
  7. for(i = 0; i < bulletList.length; i++){// basicamente 'i' representa a los contenedores de los bullet del slider
  8.   (function(index){
  9.     for (j = 0; j < bulletList[i].length; j++) {// 'j' representa a los bullets
  10.       var _bulletListSelf = bulletList[i][j];
  11.       bulletList[i][j].onclick = function(){
  12.         bulletNumber = index;
  13.         imageChanger[0].className = "fade-out";
  14.         setTimeout(function (){        
  15.           if(onclick.target == _bulletListSelf[0][j]){// Si se hace click en algun bullet del slider 'about',
  16.           //entonces cambiar la ruta de imagen usando el prefijo 'img/about_slider_'          
  17.             imageChanger[0].setAttribute('src', 'img/about_slider_' + (bulletNumber + 1) + '.png');
  18.           }if(onclick.onclick == _bulletListSelf[1][j]){// Si se hace click en algun bullet del slider 'help',
  19.             //entonces cambiar la ruta de imagen usando el prefijo 'img/help_slider_'                  
  20.             imageChanger[0].setAttribute('src', 'img/help_slider_' + (bulletNumber + 1) + '.png');
  21.           }
  22.         }, 201);
  23.         setTimeout(function (){
  24.           imageChanger[0].className = "fade-in";
  25.         }, 401);
  26.       }
  27.     }
  28.   })(i);
  29. }

Se que la solución más fácil podría sería usar una función para cada slider, pero entonces estaría repitiendo el código muchas veces, prefiero buscar una manera de simplificar e código y hacerlo fácil de mantener.

Como comento en el código, mi idea es comprobar en que bullet se ha hecho click y cambiar la ruta de la imagen dependiendo del resultado.

Si no me explique bien por favor decírmelo, llevo mucho tiempo intentado resolver esto así que estaría muy agradecido si pudieran brindarme ayuda.

Saludos.
  #2 (permalink)  
Antiguo 22/01/2017, 14:33
Avatar de siddartha23  
Fecha de Ingreso: septiembre-2013
Mensajes: 357
Antigüedad: 10 años, 7 meses
Puntos: 39
Respuesta: Comprobar click de multiples elementos

Yo lo resolvería usando Programación Orientada a Objetos, que básicamente es: generar un objeto llamado Slider, definirle sus parámetros y métodos. Luego puedes instanciar cuantos slider quieras y cada uno va funcionar independiente del otro...
__________________
velarde23.com - Soluciones Web
  #3 (permalink)  
Antiguo 23/01/2017, 09:52
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: Comprobar click de multiples elementos

1. Define el conjunto de opciones en una variable:
Código Javascript:
Ver original
  1. document.addEventListener("DOMContentLoaded", function(){
  2.     var opciones = document.querySelectorAll("#carousel-index li");
  3. }, false);

2. Delega el evento click al listado de id "carousel-index":
Código Javascript:
Ver original
  1. document.addEventListener("DOMContentLoaded", function(){
  2.     var opciones = document.querySelectorAll("#carousel-index li");
  3.  
  4.     document.querySelector("#carousel-index").addEventListener("click", function(event){
  5.         //Instrucciones
  6.     }, false);
  7. }, false);

3. En cada clic, verifica que se haya clickeado una opción (elemento <li>) y obtén el número de posición que ocupa en el conjunto de opciones:
Código Javascript:
Ver original
  1. document.addEventListener("DOMContentLoaded", function(){
  2.     var opciones = document.querySelectorAll("#carousel-index li");
  3.  
  4.     document.querySelector("#carousel-index").addEventListener("click", function(event){
  5.         if (event.target.tagName == "LI"){
  6.             var numero = opciones.indexOf(event.target);
  7.         }
  8.     }, false);
  9. }, false);

4. Si el número de posición de la opción, con respecto al conjunto de opciones, es mayor a -1 (existe), súmale uno y ese será el valor que deberás concatenar en la ruta de la imagen:
Código Javascript:
Ver original
  1. document.addEventListener("DOMContentLoaded", function(){
  2.     var opciones = document.querySelectorAll("#carousel-index li");
  3.  
  4.     document.querySelector("#carousel-index").addEventListener("click", function(event){
  5.         if (event.target.tagName == "LI"){
  6.             var numero = opciones.indexOf(event.target);
  7.  
  8.             if (numero > -1){
  9.                 imageChanger[0].src = "https://civilian-interviewe.000webhostapp.com/img/mini_slider_" + (numero + 1) + ".png";
  10.             }
  11.         }
  12.     }, false);
  13. }, false);

__________________
«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
  #4 (permalink)  
Antiguo 23/01/2017, 15:17
 
Fecha de Ingreso: septiembre-2006
Mensajes: 22
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Comprobar click de multiples elementos

Cita:
Iniciado por siddartha23 Ver Mensaje
Yo lo resolvería usando Programación Orientada a Objetos, que básicamente es: generar un objeto llamado Slider, definirle sus parámetros y métodos. Luego puedes instanciar cuantos slider quieras y cada uno va funcionar independiente del otro...
Buen punto, parece que es un buen momento para aprender opp.

He estado leyendo sobre el tema, pero podrías darme un pequeño ejemplo?

Saludos.

Alexis88, gracias por la respuesta pero creo que no me explique bien, yo ya tengo un slider, lo puedes ver [URL="http://codepen.io/GhostOrder/pen/xgZOao"]aquí[/URL], y creo que tu código también hace lo mismo. Mi problema es que necesito agregar más sliders en en una misma página, las imágenes de cada slider tienen una ruta distinta.

Lo que quiero hacer es algo como esto:

Código HTML:
Ver original
  1. <section id="productos">
  2.   <div class="slider">
  3.     <img src="img/slider-productos_img1.png"/>
  4.       <ul class="carousel-index">
  5.         <li></li>
  6.         <li></li>
  7.         <li></li>                      
  8.       </ul>
  9.     </div>
  10.  
  11. <section id="servicios">
  12.   <div class="slider">
  13.     <img src="img/slider-servicios_img1.png"/>
  14.       <ul class="carousel-index">
  15.         <li></li>
  16.         <li></li>
  17.         <li></li>                      
  18.       </ul>
  19.     </div>
  20.  
  21. <section id="otra-seccion">
  22.   <div class="slider">
  23.     <img src="img/otra-seccion_img1.png"/>
  24.       <ul class="carousel-index">
  25.         <li></li>
  26.         <li></li>
  27.         <li></li>                      
  28.       </ul>
  29.     </div>

Actualmente tengo un código funcional(el que esta en el codepen) pero es aplicable a un solo slider:

Código Javascript:
Ver original
  1. var listItemContainer = document.getElementById('carousel-index');
  2. var imageChanger = document.getElementById('image-container').getElementsByTagName('img');
  3. var bulletNumber;
  4.  
  5. for (i = 0; i < listItemContainer.children.length; i++) {
  6.   (function(index) {
  7.     listItemContainer.children[i].onclick = function() {
  8.       bulletNumber = index;
  9.       imageChanger[0].className = "fade-out";      
  10.       setTimeout(function(){
  11.         imageChanger[0].setAttribute('src', 'https://civilian-interviewe.000webhostapp.com/img/mini_slider_' + (bulletNumber + 1) + '.png');
  12.       }, 201);      
  13.       setTimeout(function(){
  14.         imageChanger[0].className = "fade-in";
  15.       }, 401);      
  16.     }
  17.   })(i);
  18. };

Como ves, si quisiese replicar esta función a cuantos slider crease en mi html, lo único que cambiaría sería la ruta de la imagen, y siendo ese el caso, pienso que mediante un condicional se podría comprobar en que bullet de que slider se hizo click y luego cambiar la ruta de la imagen.

Por ejemplo:

- Si se hizo click en el bullet 3 del slider 'productos', entonces cambiar la ruta de imagen usando el nombre 'slider-productos', de manera que la ruta completa sería 'slider-productos_img3.png'.
- Pero si se hizo click en el bullet 2 del slider 'servicios', entonces cambiar la ruta de la imagen usando el nombre 'slider-servicios', de manera que la ruta completa sería 'slider-servicios_img2.png'.

Saludos.
  #5 (permalink)  
Antiguo 24/01/2017, 08:04
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: Comprobar click de multiples elementos

En ese caso, el código de mi ejemplo tendría que estar en una función, misma que recibirá el id de la sección como argumento y la ruta, sin el número de orden, de la imagen:
Código Javascript:
Ver original
  1. function cambiarSlider(id, ruta){
  2.     var opciones = document.querySelectorAll("#" + id + " li");
  3.  
  4.     document.querySelector("#" + id).addEventListener("click", function(event){
  5.         if (event.target.tagName == "LI"){
  6.             var numero = opciones.indexOf(event.target);
  7.  
  8.             if (numero > -1){
  9.                 imageChanger[0].src = ruta + (numero + 1) + ".png";
  10.             }
  11.         }
  12.     }, false);
  13. }

De esta manera, el código se convierte en reutilizable por todos los sliders que tengas.

__________________
«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
  #6 (permalink)  
Antiguo 27/01/2017, 10:32
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: Comprobar click de multiples elementos

Código Javascript:
Ver original
  1. var numero = opciones.indexOf(event.target);
Me temo que esta línea es erronea. El error es que indexOf() no rspto una función. Para no tener ese problema podemos usar forEach(), slice() o indexOf con prototipos.
  #7 (permalink)  
Antiguo 28/01/2017, 08:23
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: Comprobar click de multiples elementos

Por responder rápido, olvidé que no se trata de un arreglo. Y eso que ya he hecho cosas así antes, pero me ganó la premura.

Código Javascript:
Ver original
  1. var numero = [].indexOf.call(opciones, event.target);

__________________
«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
  #8 (permalink)  
Antiguo 02/02/2017, 13:21
 
Fecha de Ingreso: septiembre-2006
Mensajes: 22
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Comprobar click de multiples elementos

Cita:
Iniciado por Alexis88 Ver Mensaje
Por responder rápido, olvidé que no se trata de un arreglo. Y eso que ya he hecho cosas así antes, pero me ganó la premura.

Código Javascript:
Ver original
  1. var numero = [].indexOf.call(opciones, event.target);

En primer lugar, quiero disculparme por no responder antes.

Gracias Alexis, esto es precisamente lo que estaba buscando, la función es mas pequeña de lo que hubiera imaginado.

El problema estaría resulto pero, si no fuera mucha molestia, ¿podrías explicarme a grandes rasgos el porque de '[]' ? he estado leyendo sobre prototype y call para entender esa linea pero no lo consigo.

Gracias nuevamente y saludos.
  #9 (permalink)  
Antiguo 02/02/2017, 16:23
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: Comprobar click de multiples elementos

Es una abreviatura. Hay gente que lo llama array anónimo.

Obtendrás el mismo resultado con ambas maneras
Código Javascript:
Ver original
  1. [].indexOf.call(opciones, event.target);
  2. Array,prototype.indexOf.call(opciones, event.target);
  #10 (permalink)  
Antiguo 02/02/2017, 17:43
 
Fecha de Ingreso: septiembre-2006
Mensajes: 22
Antigüedad: 17 años, 7 meses
Puntos: 0
Respuesta: Comprobar click de multiples elementos

Cita:
Iniciado por mpozo Ver Mensaje
Es una abreviatura. Hay gente que lo llama array anónimo.

Obtendrás el mismo resultado con ambas maneras
Código Javascript:
Ver original
  1. [].indexOf.call(opciones, event.target);
  2. Array,prototype.indexOf.call(opciones, event.target);
Gracias mpozo! soy nuevo en JS, de hecho programación en general y esos corchetes empezaban a confundirme.

Saludos!

Etiquetas: elementos, multiples, variable
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 22:22.