2010-05-04 6 views
10

Zut ici un aujourd'hui beaucoup - oupsJQuery supprimer .append après 5 secondes

Folks, la meilleure façon de le faire:

$j('.done').append('Your services have been updated'); 

(que les bits fait)

mais puis retirez la ajouter après 5 secondes de sorte que si une personne soumet à nouveau un formulaire (autorisé) l'append ne continue pas à ajouter le texte? à-dire mis à jour une fois « Vos services ont été mis à jour », serait deux fois lire « Vos services ont été mis à jour vos services ont été mis à jour » mais je ne voulez que vos services ont été mis à jour pour afficher une fois

Répondre

20
(function (el) { 
    setTimeout(function() { 
     el.children().remove('span'); 
    }, 5000); 
}($j('.done').append('<span>Your services have been updated</span>'))); 

Je sais que cela semble bizarre .. Je le fais de cette façon pour l'auto-confinement. L'ajout est immédiatement fait lorsque cette fonction anonyme est appelée ... cet élément ajouté est alors enregistré comme el dans cette portée anonyme, qui est elle-même retirée lorsque le timeout se déclenche après 5000ms.

Edit:

J'ai modifié la fonction ci-dessus il ne détruit pas l'élément parent (désolé)

+0

très élégant OMI, « bizarre » – dlamotte

+0

Matt un rêve, je suis d'accord avec xyld pas « bizarre » – RussP

+0

Merci, espérons que cela fonctionne pour vous. S'il vous plaît assurez-vous que vous utilisez ma dernière édition .. les extraits précédents semblaient tuer les éléments parents! – Matt

0

Je ne suis pas sûr du contexte ici, mais serait-il à faire , par exemple

<span id="special_message">Your services have been updated.</span>` 

puis de supprimer cette étiquette ID'd particulière par la suite?

0
// a little jQuery plugin... 
(function($){ 
    $.fn.timeout = function(ms, callback) 
    { 
     var self = this; 
     setTimeout(function(){ callback.call(self); }, ms); 
     return this; 
    } 
})(jQuery); 

// ...and how to use it. 
$("<span>Your services have been updated</span>") 
    .appendTo('.done') 
    .timeout(5000, function(){ this.remove(); }); 
+0

Vous remplacez la méthode jQuery .after ici. http://api.jquery.com/after/ – BBonifield

+0

True! Renommé bien sûr. Désolé pour ça ... –

0

Vous pourriez considérer le plugin Ben Alman doTimeout - http://benalman.com/projects/jquery-dotimeout-plugin/

$j('<span>Your services have been updated</span>') 
    .appendTo('.done') 
    .doTimeout(5000, 'remove'); 
+0

pourquoi utiliser plugin si vous pouvez utiliser .delay (5000) –

+0

delay() ne fonctionne que les événements qui sont placés dans la queue d'effets. –

+0

et peut donc être utilisé! –

0

J'aime cette méthode qui utilise une courte fadeout avant la durée est supprimée. Il supprime également les messages précédents avant de les ajouter.

$("<span class='js_msg'>Your services have been updated</span>") 
    .appendTo($j('.done').children("span.js_msg").remove().end()) 
    .each(function(){ 
     var self = $(this); 
     setTimeout(function() { 
      self.fadeOut(500,function(){ 
       self.remove(); 
      }); 
     }, 4500); 
    } 
); 
2

Encore une autre solution :) Quel est le code fait:

  1. crée un élément < durée > caché
  2. à élément ajoute à la classe '.ADD-commentaire.
  3. Fades dans la nouvelle plage,
  4. après une nouvelle période de 4,5 secondes, le fondu disparaît et disparaît.

    jQuery('<span />',{ style:'display:none' }) 
        .html('Mesaj trimis...') 
        .appendTo(jQuery('.add-comment')) 
        .fadeIn('slow', 
         function(){ 
          var el = jQuery(this); 
          setTimeout(function(){ 
           el.fadeOut('slow', 
            function(){ 
             jQuery(this).remove(); 
            }); 
          }, 4500); 
        });