Search code examples
jquerytabsjquery-tabs

jQuery: How to bind an event for the div when it becomes visible?


I've got a div element: <div id="tab1"> Tab data </div>.

How to bind a custom event when this div becomes visible (gets display: block;)?

And also I'd like to bind an event when this div becomes invisible (gets display: none;).

I'd like to do this in jQuery.

Edit: I'm making simple tabs with ajax content. I want the content on this tabs to be ajax-updated only when the tab is visible.


Solution

  • Start and stop the AJAX update based on the visibility. You can use .is() to return a TRUE or FALSE for :visible:

    var timer; // Variable to start and top updating timer
    
      // This if statement has to be part of the event handler for the visibility
      //   change of selector..... so there might be more straight forward solution
      //   see the last example in this answer.
    if ($(selector).is(":visible"))
    {
        // Start / continue AJAX updating
        timer = setInterval(AJAXupdate, 1000);
    } else
    {
        // Stop AJAX updating
        clearInterval(timer);
    }
    

    Here is a simple example of a timer that stops when it is invisible. Note that the numbers don't keep increasing when they're not visible:

    (function() {    
    
        var switcher;                             // variable to start and stop timer
    
          // Function / event that will be started and stopped
        function count() {
            $("div").html(1 + parseInt($("div").html(), 10));
        }
    
        $(function() {                                               // <== doc ready
    
              // Start timer - it is visible by default
            switcher = setInterval(count, 1000);
    
            $("input").click(function() {
    
                $("div").toggle();                         // Toggle timer visibility
    
                  // Start and stop timer based on visibility
                if ($("div").is(":visible"))
                {
                    switcher = setInterval(count, 1000);
                } else
                {
                    clearInterval(switcher);            
                }
            });
        });
    }());
    ​
    

    jsFiddle example


    Of course, in the above case, and maybe your case, it's more straight forward to simple alternately turn the update on and off:

    (function() {    
    
        var switcher;
    
        function count() {
            $("div").html(1 + parseInt($("div").html(), 10));
        }
    
        $(function() {
    
            switcher = setInterval(count, 1000);
    
            $("input").toggle(function() { 
                clearInterval(switcher);
                $("div").toggle(); }, 
            function() {                        
                switcher = setInterval(count, 1000);
                $("div").toggle();
            });
    
        });
    
    }());
    

    jsFiddle example