2010-03-29 5 views
0

J'ai cette fonction simple qui affiche un message à l'utilisateur. Si j'ajoute le paramètre timeout, il glissera automatiquement vers le haut si l'utilisateur n'a pas à cliquer dessus pour se débarrasser. Mais le bit de délai d'attente ne fonctionne pas.setTimeout() pas d'exécution

function feedback(text, timeout){ 
    $('#feedback').text(text).slideDown('fast'); 

    $('#feedback').click(function(){ 
     $(this).slideUp(); 
    }); 
    if(timeout){ 
     setTimeout(function(){ 
      $('#feedback').slideup(); 
     }, timeout); 
    } 
} 
+0

Qu'avez-vous passé comme argument de délai d'attente? – mck89

Répondre

3

Le problème est que $('#feedback').slideup(); a besoin d'un capital U là (par exemple .slideUp()). Vous pouvez également raccourcir le un peu faire ensemble ceci:

function feedback(text, timeout){ 
    var fb = $('#feedback').text(text).slideDown('fast'); 
    if(timeout) fb.delay(timeout).slideUp(); 

    fb.click(function(){ 
     $(this).slideUp(); 
    }); 
} 

Il utilise le haut-delay() fonctionnalité de jQuery pour obtenir le même effet d'une manière plus concise.

+0

+1 Ne connaissait pas cette nouvelle fonction 'delay()' – Matt

-3

La mise en appel d'une fonction entière à l'intérieur d'une fonction de temporisation définie n'est pas valide. Votre setTimeout ne se déclenchera jamais comme vous le souhaitez, car setTimeout n'acceptera qu'une référence de fonction.

setTimeout(function(){ 
    $('#feedback').slideup(); 
}, timeout); 

Essayez le code suivant:

var ref = function() { 
    $('#feedback').slideup(); 
}; 
setTimeout(ref, timeout); 
+0

Ceci est également incorrect, le passage d'une fonction entière est parfaitement valide. Voyez par vous-même: http://jsfiddle.net/XaEYx/ –

+0

Mauvais. Il est parfaitement acceptable de passer une construction de fonction entière en tant que paramètre. Cela s'appelle une «fermeture» – Matt