Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect if an element is visible with jQuery [duplicate]

Using .fadeIn() and .fadeOut(), I have been hiding/showing an element on my page, but with two buttons, one for hide and one for show. I now want to have one button to toggle both.

My HTML / JavaScript as it is:

<a onclick="showTestElement()">Show</a> <a onclick="hideTestElement()">Hide</a> 
function showTestElement() {   $('#testElement').fadeIn('fast'); }  function hideTestElement() {   $('#testElement').fadeOut('fast'); } 

My HTML / JavaScript as I would like to have it:

<a onclick="toggleTestElement()">Show/Hide</a> 
function toggleTestElement() {   if (document.getElementById('testElement').***IS_VISIBLE***) {     $('#testElement').fadeOut('fast');   } else {     $('#testElement').fadeIn('fast');   } } 

How do I detect if the element is visible or not?

like image 245
TheCarver Avatar asked Jan 07 '12 23:01

TheCarver


People also ask

Which jQuery filter can be used to check if element is visible?

Answer: Use the jQuery :visible Selector You can use the jQuery :visible selector to check whether an element is visible in the layout or not.

Is Div visible jQuery?

You can use .is(':visible') selects all elements that are visible.

How do you check if an HTML element is hidden in jQuery?

To check if an element is hidden or not, jQuery :hidden selector can be used. .toggle() function is used to toggle the visibility of an element.

What does show () do in jQuery?

The show() Method in jQuery is used to display the hidden and selected elements. Note: This method display the hidden elements which are using CSS display: none property. The elements are not visible whose visibility is hidden.


1 Answers

You're looking for:

.is(':visible') 

Although you should probably change your selector to use jQuery considering you're using it in other places anyway:

if($('#testElement').is(':visible')) {     // Code } 

It is important to note that if any one of a target element's parent elements are hidden, then .is(':visible') on the child will return false (which makes sense).

jQuery 3

:visible has had a reputation for being quite a slow selector as it has to traverse up the DOM tree inspecting a bunch of elements. There's good news for jQuery 3, however, as this post explains (Ctrl + F for :visible):

Thanks to some detective work by Paul Irish at Google, we identified some cases where we could skip a bunch of extra work when custom selectors like :visible are used many times in the same document. That particular case is up to 17 times faster now!

Keep in mind that even with this improvement, selectors like :visible and :hidden can be expensive because they depend on the browser to determine whether elements are actually displaying on the page. That may require, in the worst case, a complete recalculation of CSS styles and page layout! While we don’t discourage their use in most cases, we recommend testing your pages to determine if these selectors are causing performance issues.


Expanding even further to your specific use case, there is a built in jQuery function called $.fadeToggle():

function toggleTestElement() {     $('#testElement').fadeToggle('fast'); } 
like image 52
Bojangles Avatar answered Sep 28 '22 10:09

Bojangles