Eventos de Jquery cronometrados usando .each

Estoy tratando de simular un evento de clic en elementos de la lista con la misma clase, uno a la vez cada pocos segundos. He intentado esto de muchas formas diferentes. El uso de combinaciones de .each y delay () da como resultado que todos los clics se activen al mismo tiempo. Encontré a alguien con una pregunta similar y la respuesta fue hacer lo siguiente ...

            var elements = $(this).find('.slide');
            var index = 0;

            setTimeout(function () {
                $(elements).get(index).trigger("click");
                index++;
            }, 3000);

Esto me da un error js cada vez y no parece llenar la matriz ... tal vez me estoy perdiendo algo obvio ...

Muchas Gracias

preguntado el 08 de noviembre de 11 a las 16:11

Necesitamos su html aquí, ¿tiene elementos con la clase '.slide'?

3 Respuestas

Aquí está el código completamente fuera de contexto cómo activaría un clic en .list-elements cada 1 segundo usando un tiempo de espera recursivo

 (function(){
var listElements = jQuery( ".list-elements" ), i = 0;

     function triggerClick(){

        if( listElements[i] ) {
        listElements.eq( i++ ).trigger( "click" );
        window.setTimeout( triggerClick, 1000 );
        }

     }
window.setTimeout( triggerClick, 1000 );
 })()

respondido 08 nov., 11:20

En su muestra, el clic debe activarse solo una vez porque no tiene recursividad.

Intente lo siguiente:

$(this).find('.slide').each(function(index) {
    $(this).delay(3000 * index).click();
}); 

Creará todos los tiempos de espera al mismo tiempo pero con un período diferente.

respondido 08 nov., 11:20

.demora() retrasará una cola, en este caso la cola fx que parece estar vacía. No retrasa la siguiente acción en la cadena de funciones. - Esailija

Lo probé así de diferentes maneras y descubrí que al usar .each ignorará el tiempo de espera. - Adam F

jQuery.fn.delay() solo funciona para animaciones hechas con jQuery, no hay forma de retrasar el código usando el núcleo de jQuery hasta el momento. Sin embargo, hay implementación de complementos setTimeout() y los me gusta en jQuery, pero no agregan mucha funcionalidad sobre el original setTimeout().

En cuanto a arreglar tu código;)
jQuery.fn.get() obtiene el HTMLDomElement real y no tiene método .click(). (Supongo que ese es el error que está obteniendo). jQuery.fn.eq() en lugar de. Además, use setInterval() en lugar de setTimeout(), para que funcione varias veces y luego, cuando se haga clic en todos, borre el intervalo:

var interval = setInterval(function () {
  elements.eq(index).trigger("click");
  index++;
  if(index == elements.size()){
    clearTimeout(interval);
  }
}, 3000);

respondido 08 nov., 11:20

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.