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.
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);
}
});
});
}());
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();
});
});
}());
Have the event always bound to the div, but inside the event, do something like the following:
if($(self).is(":visible")){
// Implement your code
}
Now your event will only be triggered if the element is visible to the user.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With