2012-02-06 27 views
9

cssCómo pasar 'esto' en una devolución de llamada setTimeout

.item { 
    display: none; 
} 

html

<div> 
    <div class="item">machin</div> 
    <div class="item">chose</div> 
    <div class="item">chouette</div> 
    <div class="item">prout</div> 
</div> 

estoy usando jQuery y me gustaría hacer de cada .item que aparece después de una pequeño temporizador aleatorio como:

javascript

$('.item').each(function() { 
    itm = $(this); 
    setTimeout(function() { 
    itm.fadeIn(1000); 
    }, Math.floor(Math.random() * 1000)); 
}) 

Aquí itm contendrá siempre el último elemento ya que la función se evalúa después de todas las tareas. No puedo usar el 3er parámetro de setTimeout() porque no funcionará en IE.
No se recomienda utilizar setTimeout() con el método eval por razones de seguridad.

Entonces, ¿cómo puedo acceder a mi objeto a través de setTimeout()?


Editar

Sé que esta pregunta ya se han publicado.
Pero pensé que era un poco específico con el contexto each().
Ahora alguien ha cambiado por completo el título de mi pregunta que originalmente era algo así como 'setTimeout() - jQuery.each() este parámetro objeto'

+0

'this' interior de' setTimeout() 'hace referencia al objeto global. Su código anterior ni siquiera debería funcionar para el último artículo. –

+0

Lo siento, en realidad estaba haciendo 'itm = $ (this)' en mi código en lugar de 'var itm = $ (this)', actualicé mi pregunta. Entonces, ahora no sé qué respuesta aceptar :) –

+3

@PierredeLESPINAY Aha. La diferencia entre 'var itm' y' itm' es que sin 'var' es una sola variable global, en lugar de una variable local para cada llamada de la función adjunta. Es por eso que setTimeout solo vio el último elemento en la lista. – Izkata

Respuesta

2

Necesita almacenar this en una variable independiente:

$('.item').each(function() { 
    var me = $(this); 
    setTimeout(function() { 
    me.fadeIn(1000); 
    }, Math.floor(Math.random() * 1000)); 
}) 
2

El truco aquí es salvar this en un local que pueda ser evaluada de forma segura en el setTimeout devolución de llamada

$('.item').each(function() { 
    var self = this; 
    setTimeout(function() { 
    $(self).fadeIn(1000); 
    }, Math.floor(Math.random() * 1000)); 
}); 
2

Prueba esto:

$('.item').each(function() { 
var myVar = $(this); 
setTimeout(function() { 
myVar.fadeIn(1000); 
}, Math.floor(Math.random() * 1000)); 
}) 
2

Prueba este insteed:

$('.item').each(function() { 
     var elm = this; 
     setTimeout(function() { 
     $(elm).fadeIn(1000); 
     }, Math.floor(Math.random() * 1000)); 
    }) 

No puedo explicar por qué funciona, pero creo que esto es una referencia a otro "esto" en su setTimeout.

http://jsfiddle.net/Pdrfz/

2

Prueba esto:

$('.item').each(function() { 
    var item =$(this); 
    setTimeout(function() { 
      item.fadeIn(1000); 
     }, 
     Math.floor(Math.random() * 1000)); 
    }); 
3

Antes setTimeout ejecuta each bucle hubiera terminado de ejecutarse, no va a esperar. También dentro de setTimeout función this no se referirá al elemento DOM.

Pruebe algo como esto.

function fadeItem(item){ 
    item.fadeIn(1000); 
} 

$('.item').each(function() { 
    var $item = $(this); 
    setTimeout(function() { 
    fadeItem($item); 
    }, Math.floor(Math.random() * 1000)); 
}); 

También puede intentar algo como esto.

var $items = $('.item'), count = 0; 

function fadeItem(item){ 
    item.fadeIn(1000); 
    if(count < $items.length){ 
     setTimeout(function(){ 
      fadeItem($items.eq(count++)); 
     }, Math.floor(Math.random() * 1000)); 
    } 
} 
setTimeout(function(){ 
    fadeItem($items.eq(count++)); 
}, Math.floor(Math.random() * 1000)); 
Cuestiones relacionadas