Effect Delay Trick
Here is a quick trick for getting an effect to delay without using setTimeout
.
Let's say, for example, that I want to show an alert message on the page every time a user clicks on a certain button. But I don't want it to stay there forever; I want it to go away a few seconds later. You know, like the way they do in all of those crazy Web 2.0 sites.
Update
In version 1.4, jQuery introduced a .delay()
method that allows you to do the same thing as I show below, but without the hack. If you're using jQuery 1.4 or above, definitely use .delay()
instead. It takes one argument, the number of milliseconds to delay. Read more about it in the online documentation
The HTML
Well, first I'll need a message, along with a container for it:
[html]Oh, I should also put my button into the HTML—something like this: <input type="submit" id="show-alert" value="Show Alert" />
The CSS
Now I could also use some stylin' for that quick-alert
class:
I'll stick that in my stylesheet so that it's ready to be applied to our new, button-generated DIV.
Inserting the Content
On to the code! First, we'll get our message to be inserted when someone clicks on the "Show Alert" button. Let's put the message right after the button, like so:
[js]$(document).ready(function() { $('#show-alert').click(function() { $('So, basically, what I'm saying here is, upon clicking the <input id="show-alert" />
button, create this div
with the class and all the text inside of it, and place it right after the button. Notice the backslash in "it\'s." That keeps jQuery from getting confused That escapes the single quote, which is necessary because otherwise — as Dave Cardwell explains in his comment — "the JavaScript parser would interpret that as the close of the string."
Adding the Effects
So far, so good. Now I'm going to add my .fadeIn()
and .fadeOut()
effects. And after those are done, I'll remove the div
that I just created. No sense keeping it around:
Because I put $(this).remove()
in the callback of the .fadeOut()
method, it occurs after the the fading out is finished.
The Delay
So, here's the thing. The entry's title says that this is a trick, right? Well, I hope it's not a dirty trick, but here goes the full code:
[js]$(document).ready(function() { $('#show-alert').click(function() { $('Do you see that .animate()
method there? I have it animating to a full opacity in 3 seconds. But the div
is already at full opacity, so it just sits there looking like it's doing nothing for 3 seconds. Isn't that cute?
Here you go. Try it out for yourself:
I hope you enjoyed the message while it lasted!