Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Agrupar Evento onclick

Estas en el tema de Agrupar Evento onclick en el foro de Javascript en Foros del Web. Hola. He instalado un script que lleva de un enlace a una zona de la página con un efecto de scroll de transición. Concretamente éste: ...
  #1 (permalink)  
Antiguo 30/01/2016, 09:09
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Agrupar Evento onclick

Hola.

He instalado un script que lleva de un enlace a una zona de la página con un efecto de scroll de transición.

Concretamente éste:

Código:
  window.smoothScroll = function(target) {
    var scrollContainer = target;
    do { //find scroll container
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop == 0);
    
    var targetY = 0;
    do { //find the top of target relatively to the container
        if (target == scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);
    
    scroll = function(c, a, b, i) {
        i++; if (i > 30) return;
        c.scrollTop = a + (b - a) / 30 * i;
        setTimeout(function(){ scroll(c, a, b, i); }, 20);
    }
    // start scrolling
    scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0);
}
Luego pones este evento en cualquier enlace que quieras para que te lleve a una zona de la página de forma suave:


Código:
<a href="#seccion-a" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-a'))">Sección A</a>
Por dar más detalles os diré que se trata de una página de FAQ con un buen número de preguntas en enlaces que deben conducir a la respuesta.

Funciona perfectamente, pero me he puesto a editar la página en cuestión y he visto que el evento en sí (onclick="smoothScroll(document.getElementById('xx xxx'))" ) se repite y se repite añadiendo mucho peso a la página, y he pensado si no se podría hacer un acercamiento común al tema, es decir, quitarlo e incluirlo en el script, fuera de la página, generalizarlo de algún modo para evitar esto:

Código:
<a href="#seccion-a" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-a'))">Sección A</a>	
<a href="#seccion-b" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-b'))">Sección B</a>	
<a href="#seccion-c" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-c'))">Sección C</a>	
<a href="#seccion-d" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-d'))">Sección D</a>	
<a href="#seccion-e" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-e'))">Sección E</a>	
<a href="#seccion-f" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-f'))">Sección F</a>	
<a href="#seccion-g" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-g'))">Sección G</a>	
<a href="#seccion-h" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-h'))">Sección H</a>	
<a href="#seccion-i" rel="nofollow" onclick="smoothScroll(document.getElementById('seccion-i'))">Sección I</a>	
...
...
...
Si me entendéis.

Gracias.
  #2 (permalink)  
Antiguo 30/01/2016, 09: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: Agrupar Evento onclick

Una forma efectiva consiste en delegar el evento ya sea al elemento que contiene a los enlaces o al documento. Para esto, tendrás que dejar de trabajar con JavaScript inline.

Código Javascript:
Ver original
  1. document.addEventListener("click", function(event){
  2.     if (event.target.href.indexOf("#seccion-") > -1){
  3.         smoothScroll(document.querySelector(event.target.href));
  4.     }
  5. }, false);

Cuando se produzca el evento click en el documento, toma al elemento directamente afectado por el clic mediante la propiedad event.target y verifica que en su propiedad href se encuentre el texto "#seccion-"; de ser así, ejecutas tu función pasándole como argumento al elemento hacia el cual apunta el ancla del enlace.

Un saludo
__________________
«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 30/01/2016, 11:33
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Respuesta: Agrupar Evento onclick

He colocado el tema como solucionado pero veo que no es así.

En principio, se trata de que los ejemplos de link "seccion" son un ejemplo nada más, porque lo cierto es que se trata de preguntas totalmente distintas, con lo que no es posible el establecer esa localización de palabra "seccion-" dentro de la propiedad href.

Supongo que se podría hacer mediante una clase. ¿Sí?
  #4 (permalink)  
Antiguo 30/01/2016, 11: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: Agrupar Evento onclick

Claro. La idea es utilizar un valor común a todos los elementos que se desee afectar.

En el caso de una clase, la condición sería así:
Código Javascript:
Ver original
  1. if (event.target.className == "la clase"){
  2.     //...
  3. }
__________________
«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 30/01/2016, 13:04
 
Fecha de Ingreso: noviembre-2005
Mensajes: 889
Antigüedad: 18 años, 5 meses
Puntos: 8
Respuesta: Agrupar Evento onclick

Código:
  document.addEventListener("click", function(event){
 if (event.target.className == "la-clase"){
 window.smoothScroll = function(target) {
    var scrollContainer = target;
    do { //find scroll container
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop == 0);
    
    var targetY = 0;
    do { //find the top of target relatively to the container
        if (target == scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);
    
    scroll = function(c, a, b, i) {
        i++; if (i > 30) return;
        c.scrollTop = a + (b - a) / 30 * i;
        setTimeout(function(){ scroll(c, a, b, i); }, 20);
    }
    // start scrolling
    scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0);
}
    }
}, false);
El enlace lo he puesto así:

Código:
<a class="la-clase" href="!#enlace" rel="nofollow"">¿Enlace?</a>
Disculpa Alexis, pero no me sale.

Falta de conocimientos.

Última edición por JUMASOL; 30/01/2016 a las 15:31

Etiquetas: agrupar, evento, funcion, onclick, scroll
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 14:20.