2010-11-04 8 views
2

Je crée un diaporama personnalisé pour un projet écrit avec jQuery. Chaque diaporama a 4 événements liés à lui (jouer, arrêter, suivant, prev). Les contrôles apparaissent au survol de la souris et au passage du curseur. Au passage de la souris, je veux un retard dans les contrôles qui disparaissent. Pour y parvenir, j'ai utilisé setTimeout.setTimeout pas retardé avec une fonction anonyme

$(this).attr('timeout', setTimeout((function(obj){obj.fadeOut(250);})($(this)), 1000)); 

C'est cependant à l'origine un « appel setTimeout inutile (manque des guillemets autour de l'argument?) » Erreur

J'ai enlevé le ($(this)) pour voir si je pouvais simplifier les choses.

$(this).attr('timeout', setTimeout((function(foo){alert(foo);})('bar'), 1000)); 

Cela a provoqué « bar » à afficher dans la boîte de message d'alerte sur mouseout sans délai, ou les erreurs signalées dans Firebug. Je ne peux que supposer par cette logique que la fonction anonyme est exécutée tout de suite, ce qui ne laisse rien à l'appel de setTimeout plus tard.

Si j'ignorer la nécessité de passer $ (cela) dans la fonction anonyme et essayer

$(this).attr('timeout', setTimeout(function(){alert('foo');}, 1000)); 

tout fonctionne comme prévu, je dois faire quelque chose de mal avec la syntaxe de la fonction anonyme, mais je suis à partir d'idées sur ce que cela pourrait être.

Merci

Répondre

2

Puisque vous utilisez jQuery, il suffit d'utiliser $.proxy() pour définir le contenxt d'appel, comme ceci:

$(this).attr('timeout', 
    setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000)); 

Notez bien que ce n'est pas un attribut valide, il est préférable de stocker les choses comme ça dans .data(), comme ceci:

$(this).data('timeout', 
    setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000)); 

Ou ceci:

$.data(this, setTimeout($.proxy(function(){ $(this).fadeOut(250); }, this), 1000)); 

Le problème avec votre méthode actuelle est que c'est auto-Allégation:

(function(foo){alert(foo);})('bar') 

Si vous voulez retourner une fonction avec le bon contexte ... de façon plus concise fait avec $.proxy() ci-dessus ton cas.

Questions connexes