2010-11-24 15 views
6

Tengo un div como estoJavaScript setTimeout o retraso jQuery - ni están trabajando para mí

<div id="sale"> 
    ........ 
</div> 

y traté de usar tanto

$('#sale').delay(3000).slideDown(500); 

y

setTimeout(sale(), 3000); 

function sale() { 
    $('#sale').slideDown(500); 
} 

pero tampoco de ellos están trabajando. El retraso de jQuery dice que $('#sale').delay() no es una función mientras que setTimeout dice inútil setTimeout llamada (comillas faltantes). Si agrego comillas dobles en la llamada sale(), solo dice "La venta no está definida".

¿Por qué ninguno de estos funciona?

Todo lo que trato de hacer es hacer que un div aparezca 3 segundos después de que se cargue la página.

+0

'setTimeout (venta, 3000);', no 'setTimeout (sale(), 3000);' – Reigel

+2

El método '.delay()' se agregó en 'jQuery 1.4'. Qué versión estás usando? – user113716

Respuesta

15

En el caso de setTimeout simplemente lo está haciendo mal.

setTimeout(sale(), 3000); // will call sale and use the RETURN value in the callback but sale returns undefined 

Es necesario pasar de una función:

function sale() { 
    $('#sale').slideDown(500); 
} 

setTimeout(sale, 3000); // just pass in the reference to sale() 

Otra posibilidad:

// no difference in this case 
// Note: if it were obj.sale() then you would need to do this version 
//  otherwise sale() will get called with the this set to window 
setTimeout(function(){sale()}, 3000) 

Y por último pero no menos importante:

setTimeout(function() { $('#sale').slideDown(500); }, 3000); 
+0

No tiene sentido la función extra. –

+0

@Matthew Lo sé, lo arreglé, solo hábito, ya que siempre termino con la necesidad de eso cuando uso setTimeout;) –

+0

, alternativamente, puedes poner la animación dentro de la función anónima –

6

Debe estar en una cola para que delay() funcione.

$('#sale').queue(function() { 

    $(this).delay(3000).slideDown(500).dequeue(); 

}); 

See it.

Patrick Dw ha informado en los comentarios que no necesita estar en una queue() si su próxima cadena método es una animación. Ver su JSFiddle.

+0

delay() no puede ser el * primer * elemento de una cadena de animación? – AndreKR

+0

@AndreKR - Sí, puede. Esta respuesta es incorrecta http://jsfiddle.net/patrick_dw/Uts7t/ – user113716

+0

@patrick dw Podría * jurar * Recientemente leí que necesitas estar en 'queue()' para 'delay()' para funcionar ... Oh bien. ¿Es este un desarrollo reciente de jQuery? – alex

0
setTimeout(sale, 3000); 

Antes, estabas pasando setTimeout el valor de retorno de sale. Esto pasa la función real.

0

En su primera solución, parece que jQuery ni siquiera está cargado.

En el segundo código que tiene que hacer setTimeout(sale, 3000); (omitir los paréntesis), ya que con ellos que está llamando setTimeout con el retorno de sale(), que es undefined.

+0

No, está "indefinido" –

+0

Argh, no estaba seguro ... perdí la oportunidad del 50/50. ;) – AndreKR

+0

jquery está cargado. simplemente no publiqué esa parte – Catfish

0
setTimeout("sale();", 3000); 
+1

Mala idea - esto evoca internamente un 'eval() 'tipo de función. Simplemente pase 'venta' como argumento. – alex

+0

Otro posible problema con esto es que no es raro definir funciones dentro del controlador '.ready()'. Si ese es el caso, 'sale' sería inaccesible para' setTimeout' que intenta evaluar la cadena en el contexto global. – user113716