views:

355

answers:

4

This function adds an overlay with the following properties to the entire browser screen,

$('a.cell').click(function()    {
 $('<div id = "overlay" />').appendTo('body').fadeIn("slow");
});

#overlay
{
background-color: black;
width: 100%;
height: 100%;
position: fixed;
top: 0;
left: 0;
display: none;
z-index: 100;
opacity: 0.5;
}

And this function is supposed to remove it.

$('#overlay').click(function()  {
 $(this).fadeOut("slow").remove();
});

But it seems to do absolutely nothing and now my page is stuck with a black overly over it. What's wrong with the removal?

+1  A: 

Try:

$('#overlay').live('click', function()  {
        $(this).fadeOut("slow").remove();
});
Sbm007
That works, although it seems to be removing the element before fading it out.
Mathias Schnell
+6  A: 

The problem is that when you're adding the click handler, there isn't any overlay, so you're adding the handler to an empty set of elements.

To fix this, use the live method to bind your handler to all elements that match #overlay, whenever they are created.

Also, fadeOut is not a blocking call, so it returns before the element finishes fading out. Therefore, you're calling remove right after the element starts fading out.

To fix this, use fadeOut's callback parameter to call remove after the animation finishes.

For example:

$('#overlay').live(function() { 
    $(this).fadeOut("slow", function() { $(this).remove(); });
});
SLaks
Ah, I understand now. I hadn't realized that the handlers were bound to the elements once the page is loaded. I had thought of my JS as more of a library to look up once an even has occurred and then perform any functions that match what has happened on the page. But now that I think about it, that would be incredibly slow and take up a lot of resources. The way you described it fits much better than my way of thinking. Thanks for the info.
Mathias Schnell
+2  A: 

Remove should be in the callback to fadeout, like so:

$('#overlay').live('click', function()  {
    $(this).fadeOut("slow", function() {
       $(this).remove();
    });
});
PKKid
Yes, thank you. That's exactly the code I was looking for.
Mathias Schnell
+3  A: 

Here you go. This should fix the problem and let the overlay fade out before removing it.

$('#overlay').live("click", function()  {
        $(this).fadeOut("slow", function() { $(this).remove() });
});
Sean Vieira