Làm cách nào để kiểm tra xem một phần tử có bị ẩn trong jQuery không?


7741

Là nó có thể để chuyển tầm nhìn của một phần tử, sử dụng các chức năng .hide(), .show()hoặc .toggle()?

Làm thế nào bạn sẽ kiểm tra nếu một yếu tố là visiblehoặc hidden?


49
Điều đáng nói (thậm chí sau tất cả thời gian này), $(element).is(":visible")hoạt động cho jQuery 1.4.4, nhưng không phải cho jQuery 1.3.2, trong Internet & nbsp; Explorer & nbsp; 8 . Điều này có thể được kiểm tra bằng đoạn kiểm tra hữu ích của Tsvetomir Tsonev . Chỉ cần nhớ thay đổi phiên bản của jQuery, để kiểm tra theo từng cái.
Reuben

2
Điều này có liên quan mặc dù một câu hỏi khác: stackoverflow.com/questions/17425543/ Kẻ
Mark Schultheiss

Câu trả lời:


9398

Vì câu hỏi đề cập đến một yếu tố duy nhất, mã này có thể phù hợp hơn:

// Checks CSS content for display:[none|block], ignores visibility:[true|false]
$(element).is(":visible");

// The same works with hidden
$(element).is(":hidden");

Nó giống như đề xuất của twernt , nhưng được áp dụng cho một yếu tố duy nhất; và nó phù hợp với thuật toán được đề xuất trong Câu hỏi thường gặp về jQuery .

Chúng tôi sử dụng jQuery là () để kiểm tra phần tử được chọn với một phần tử khác, bộ chọn hoặc bất kỳ đối tượng jQuery nào. Phương thức này di chuyển dọc theo các phần tử DOM để tìm một kết quả khớp, thỏa mãn tham số đã truyền. Nó sẽ trả về true nếu có một trận đấu, nếu không thì trả về false.


164
Giải pháp này dường như sẽ khuyến khích việc đốt cháy visible=falsedisplay:none; trong khi giải pháp của Mote rõ ràng làm sáng tỏ ý định của các lập trình viên để kiểm tra display:none; (thông qua đề cập đến ẩn và hiển thị kiểm soát nào display:nonekhông visible=true)
kralco626

93
Điều đó là chính xác, nhưng :visiblecũng sẽ kiểm tra xem các phần tử cha có thể nhìn thấy được không, như chiborg đã chỉ ra.
Tsvetomir Tsonev

45
Bạn có một điểm - Tôi sẽ làm rõ rằng mã chỉ kiểm tra displaytài sản. Cho rằng câu hỏi ban đầu là cho show()hide(), và họ đặt ra display, câu trả lời của tôi là chính xác. Nhân tiện, nó hoạt động với IE7, đây là đoạn kiểm tra - jsfiddle.net/MWZss ;
Tsvetomir Tsonev

53
Tôi thực sự thấy rằng các từ logic đảo ngược tốt hơn :! $ ('Bộ chọn'). Là (': hidden'); đối với một số lý do. Đáng để thử.
Kzqai

21
Đây là một thử nghiệm điểm chuẩn đơn giản là () chống lại regrec : jsperf.com/jquery-is-vs-regapid-for-css-visibility . Kết luận: nếu bạn hết hiệu suất, hãy sử dụng regrec over is () (vì is () sẽ tìm tất cả các nút ẩn trước khi xem phần tử thực tế).
Max Leske

1457

Bạn có thể sử dụng hiddenbộ chọn:

// Matches all elements that are hidden
$('element:hidden')

visiblebộ chọn:

// Matches all elements that are visible
$('element:visible')

67
chỉ cần cẩn thận, có một số mẹo liên quan đến hiệu suất tốt trong bản trình bày này: addyosmani.com/jqprovenperformance
codecraig

27
Trên trang 21 đến 28, nó hiển thị mức độ chậm: ẩn hoặc: hiển thị được so sánh với các bộ chọn khác. Cảm ơn đã chỉ ra điều này.
Etienne Dupuis

109
Khi bạn đang phải đối phó với một vài yếu tố và rất ít xảy ra - tức là SỰ CHÍNH XÁC CỦA CÁC TRƯỜNG HỢP TUYỆT VỜI - vấn đề thời gian là một vấn đề nhỏ vô lý. Ôi không! Phải mất 42 ms thay vì 19 ms !!!
vbullinger

16
Tôi đang chuyển đổi phần tử một cách ngẫu nhiên bằng cách sử dụng bộ chọn này. $ ('phần tử: ẩn') luôn đúng với tôi!
Phóng to

15
@cwingrav Bạn có thể muốn đọc lại tài liệu ,: ẩn áp dụng cho tất cả các yếu tố. Các phần tử biểu mẫu type="hidden"chỉ là một trường hợp có thể kích hoạt: ẩn. Các phần tử không có chiều cao và chiều rộng, các phần tử có display: nonevà các phần tử có tổ tiên ẩn cũng sẽ đủ điều kiện là: ẩn.
Joshua Walsh

948
if ( $(element).css('display') == 'none' || $(element).css("visibility") == "hidden"){
    // 'element' is hidden
}

Phương pháp trên không xem xét khả năng hiển thị của cha mẹ. Để xem xét cha mẹ là tốt, bạn nên sử dụng .is(":hidden")hoặc .is(":visible").

Ví dụ,

<div id="div1" style="display:none">
  <div id="div2" style="display:block">Div2</div>
</div>

Phương pháp trên sẽ xem xét div2có thể nhìn thấy trong khi :visiblekhông. Nhưng những điều trên có thể hữu ích trong nhiều trường hợp, đặc biệt là khi bạn cần tìm xem có lỗi div nào hiển thị trong phần cha mẹ ẩn không vì trong các điều kiện như vậy :visiblesẽ không hoạt động.


131
Điều này chỉ kiểm tra thuộc tính hiển thị của một yếu tố duy nhất. Thuộc tính: nhìn thấy cũng kiểm tra khả năng hiển thị của các phần tử cha.
chiborg

16
Đây là giải pháp duy nhất hiệu quả với tôi khi thử nghiệm với IE 8.
evanmcd

20
@chiborg Có, nhưng đôi khi đó là những gì bạn muốn và tôi đã phải học một cách khó khăn về việc jQuery "thông minh" như thế nào ...
Casey

9
Điều này không trả lời câu hỏi, câu hỏi là về một yếu tố duy nhất và bằng cách sử dụng hide(), show()và các toggle()hàm, tuy nhiên, như hầu hết đã nói, chúng ta nên sử dụng các lớp giả :visible:hidden.
Jimmy Knoot

2
Câu trả lời này có thể được sử dụng khi một phần tử tồn tại nhưng hiện không có trên trang, chẳng hạn như sau khi tách ().
atheaos

526

Không có câu trả lời nào trong số này giải quyết những gì tôi hiểu là câu hỏi, đó là điều tôi đang tìm kiếm, "Làm thế nào để tôi xử lý các mục có visibility: hidden?" . Cả hai :visiblecũng :hiddensẽ không xử lý việc này, vì cả hai đều đang tìm kiếm hiển thị cho mỗi tài liệu. Theo như tôi có thể xác định, không có bộ chọn để xử lý khả năng hiển thị CSS. Đây là cách tôi giải quyết nó (bộ chọn jQuery tiêu chuẩn, có thể có một cú pháp cô đọng hơn):

$(".item").each(function() {
    if ($(this).css("visibility") == "hidden") {
        // handle non visible state
    } else {
        // handle visible state
    }
});

18
Câu trả lời này là tốt để xử lý theo visibilitynghĩa đen, nhưng câu hỏi là How you would test if an element has been hidden or shown using jQuery?. Sử dụng jQuery có nghĩa là: displaytài sản.
MarioDS

10
Các yếu tố có visibility: hiddenhoặc opacity: 0được coi là có thể nhìn thấy, vì chúng vẫn tiêu tốn không gian trong bố cục. Xem câu trả lời của Pedro Rainhotài liệu jQuery trên :visiblebộ chọn.
kinh ngạc

9
bạn cần duyệt qua DOM để kiểm tra cha mẹ của nút, nếu không, điều này là vô ích.
vsync

389

Từ Làm cách nào để xác định trạng thái của phần tử được bật?


Bạn có thể xác định xem một phần tử có được thu gọn hay không bằng cách sử dụng :visible:hiddenbộ chọn.

var isVisible = $('#myDiv').is(':visible');
var isHidden = $('#myDiv').is(':hidden');

Nếu bạn chỉ đơn giản hành động trên một yếu tố dựa trên khả năng hiển thị của nó, bạn chỉ có thể bao gồm :visiblehoặc :hiddentrong biểu thức bộ chọn. Ví dụ:

 $('#myDiv:visible').animate({left: '+=200px'}, 'slow');

4
tự hỏi tại sao không có câu trả lời nào đề cập đến trường hợp khi phần tử được di chuyển ra khỏi cửa sổ có thể nhìn thấy, như top:-1000px... Đoán đây là một trường hợp cạnh
jazzcat

294

Thông thường khi kiểm tra xem một cái gì đó có thể nhìn thấy hay không, bạn sẽ đi ngay lập tức và làm một cái gì đó khác với nó. jQuery chuỗi làm cho điều này dễ dàng.

Vì vậy, nếu bạn có một bộ chọn và bạn chỉ muốn thực hiện một số hành động trên nó nếu có thể nhìn thấy hoặc ẩn đi, bạn có thể sử dụng filter(":visible")hoặc filter(":hidden")theo sau bằng cách xâu chuỗi nó với hành động bạn muốn thực hiện.

Vì vậy, thay vì một iftuyên bố, như thế này:

if ($('#btnUpdate').is(":visible"))
{
     $('#btnUpdate').animate({ width: "toggle" });   // Hide button
}

Hoặc hiệu quả hơn, nhưng thậm chí xấu hơn:

var button = $('#btnUpdate');
if (button.is(":visible"))
{
     button.animate({ width: "toggle" });   // Hide button
}

Bạn có thể làm tất cả trong một dòng:

$('#btnUpdate').filter(":visible").animate({ width: "toggle" });

25
Không có lý do để trích xuất nút DOM trong đoạn trích được sử dụng trong ví dụ và sau đó phải tìm lại nó. Tốt hơn là chỉ nên làm: var $ button = $ ('# btnUpdate'); Và sau đó trong biểu thức If chỉ sử dụng nút $ thay vì $ (nút). Có lợi thế của bộ nhớ đệm đối tượng jQuery.
LocalPCGuy

1
đây là một ví dụ đơn giản jquerypot.com/ từ
Ketan Savaliya

242

Bộ :visiblechọn theo tài liệu jQuery :

  • Chúng có displaygiá trị CSS là none.
  • Chúng là các yếu tố hình thức với type="hidden".
  • Chiều rộng và chiều cao của chúng được đặt rõ ràng là 0.
  • Một phần tử tổ tiên bị ẩn, vì vậy phần tử không được hiển thị trên trang.

Các yếu tố có visibility: hiddenhoặc opacity: 0được coi là có thể nhìn thấy, vì chúng vẫn tiêu tốn không gian trong bố cục.

Điều này hữu ích trong một số trường hợp và vô dụng trong những trường hợp khác, bởi vì nếu bạn muốn kiểm tra xem phần tử có nhìn thấy được không ( display != none), bỏ qua khả năng hiển thị của cha mẹ, bạn sẽ thấy rằng việc làm .css("display") == 'none'không chỉ nhanh hơn mà còn trả về kiểm tra khả năng hiển thị một cách chính xác.

Nếu bạn muốn kiểm tra mức độ hiển thị thay vì hiển thị, bạn nên sử dụng : .css("visibility") == "hidden".

Cũng xem xét các ghi chú jQuery bổ sung :

Do :visiblelà phần mở rộng của jQuery và không phải là một phần của đặc tả CSS, nên các truy vấn sử dụng :visiblekhông thể tận dụng hiệu suất tăng hiệu suất được cung cấp bởi querySelectorAll()phương thức DOM gốc . Để đạt được hiệu suất tốt nhất khi sử dụng :visibleđể chọn các thành phần, trước tiên hãy chọn các thành phần bằng bộ chọn CSS thuần, sau đó sử dụng .filter(":visible").

Ngoài ra, nếu bạn lo lắng về hiệu suất, bạn nên kiểm tra Bây giờ bạn thấy tôi Hiển thị / ẩn hiệu suất (2010-05-04). Và sử dụng các phương pháp khác để hiển thị và ẩn các yếu tố.


214

Điều này làm việc cho tôi, và tôi đang sử dụng show()hide()để làm cho div của tôi bị ẩn / hiển thị:

if( $(this).css('display') == 'none' ){
    /* your code goes here */
} else {
    /* alternate logic   */
}

213

Khả năng hiển thị phần tử và jQuery hoạt động như thế nào ;

Một yếu tố có thể được ẩn với display:none, visibility:hiddenhoặc opacity:0. Sự khác biệt giữa các phương thức đó:

  • display:none ẩn phần tử và nó không chiếm bất kỳ khoảng trống nào;
  • visibility:hidden ẩn phần tử, nhưng nó vẫn chiếm không gian trong bố cục;
  • opacity:0ẩn phần tử là "mức độ hiển thị: ẩn" và nó vẫn chiếm không gian trong bố cục; sự khác biệt duy nhất là độ mờ cho phép người ta làm cho một phần tử trong suốt;

    if ($('.target').is(':hidden')) {
      $('.target').show();
    } else {
      $('.target').hide();
    }
    if ($('.target').is(':visible')) {
      $('.target').hide();
    } else {
      $('.target').show();
    }
    
    if ($('.target-visibility').css('visibility') == 'hidden') {
      $('.target-visibility').css({
        visibility: "visible",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        visibility: "hidden",
        display: ""
      });
    }
    
    if ($('.target-visibility').css('opacity') == "0") {
      $('.target-visibility').css({
        opacity: "1",
        display: ""
      });
    } else {
      $('.target-visibility').css({
        opacity: "0",
        display: ""
      });
    }

    Các phương thức chuyển đổi jQuery hữu ích:

    $('.click').click(function() {
      $('.target').toggle();
    });
    
    $('.click').click(function() {
      $('.target').slideToggle();
    });
    
    $('.click').click(function() {
      $('.target').fadeToggle();
    });

20
Một điểm khác biệt giữa visibility:hiddenopacity:0là phần tử vẫn sẽ phản hồi với các sự kiện (như nhấp chuột) với opacity:0. Tôi đã học được rằng thủ thuật làm một nút tùy chỉnh để tải lên tập tin.
urraka

1
ngoài ra, nếu bạn ẩn đầu vào với độ mờ: 0, nó vẫn được chọn bằng phím tab
YangombiUmpakati

161

Bạn cũng có thể làm điều này bằng cách sử dụng JavaScript đơn giản:

function isRendered(domObj) {
    if ((domObj.nodeType != 1) || (domObj == document.body)) {
        return true;
    }
    if (domObj.currentStyle && domObj.currentStyle["display"] != "none" && domObj.currentStyle["visibility"] != "hidden") {
        return isRendered(domObj.parentNode);
    } else if (window.getComputedStyle) {
        var cs = document.defaultView.getComputedStyle(domObj, null);
        if (cs.getPropertyValue("display") != "none" && cs.getPropertyValue("visibility") != "hidden") {
            return isRendered(domObj.parentNode);
        }
    }
    return false;
}

Ghi chú:

  1. Hoạt động ở mọi nơi

  2. Hoạt động cho các yếu tố lồng nhau

  3. Hoạt động cho CSS và kiểu nội tuyến

  4. Không yêu cầu khung


6
Hoạt động hơi khác với jQuery; nó được coi visibility: hiddenlà có thể nhìn thấy .
alex

4
Thật dễ dàng để thay đổi mã ở trên để bắt chước hành vi jQuery (được cho là ngu ngốc). . . . . hàm isRendered (o) {if ((o.nodeType! = 1) || (o == document.body)) {return true;} if (o.cienStyle && o.cienStyle ["display"]! = "none") {return isRendered (o.parentNode);} other if (window.getComputingStyle) {if (document.defaultView.getComputingStyle (o, null) .getPropertyValue ("display")! = "none") );}} trả về false;}
Matt Brock

3
Chắc chắn, tôi chỉ thêm rằng vì lợi ích của người dùng đã sử dụng mà không quét mã của nó. :)
alex

160

Tôi sẽ sử dụng lớp CSS .hide { display: none!important; }.

Để ẩn / hiển thị, tôi gọi .addClass("hide")/.removeClass("hide"). Để kiểm tra khả năng hiển thị, tôi sử dụng .hasClass("hide").

Đó là một cách đơn giản và rõ ràng để kiểm tra / ẩn / hiển thị các yếu tố, nếu bạn không có kế hoạch sử dụng .toggle()hoặc .animate()phương pháp.


11
.hasClass('hide')không kiểm tra xem tổ tiên của cha mẹ có bị ẩn hay không (điều này cũng sẽ ẩn đi). Bạn có thể có thể làm cho điều này hoạt động chính xác bằng cách kiểm tra nếu .closest('.hide').length > 0, nhưng tại sao lại phát minh lại bánh xe?
Nbrooks

1
Biến thể bạn đề xuất trả về nếu phần tử hiển thị trên html, biến thể của tôi trả về nếu phần tử bị ẩn trực tiếp bởi mã javascript / công cụ xem của bạn. Nếu bạn biết rằng các phần tử cha không bao giờ bị ẩn - hãy sử dụng .hasClass () để nghiêm ngặt hơn và ngăn ngừa các lỗi trong tương lai. Nếu bạn muốn kiểm tra không chỉ mức độ hiển thị mà cả trạng thái phần tử cũng được đặt - hãy sử dụng .hasClass (). Trong các trường hợp khác .closest () là tốt hơn.
Evgeny Levin

1
Tại sao bạn không sử dụng .is (": thấy")?
dont_trust_me

138

Liên kết demo

$('#clickme').click(function() {
  $('#book').toggle('slow', function() {
    // Animation complete.
    alert($('#book').is(":visible")); //<--- TRUE if Visible False if Hidden
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="clickme">
  Click here
</div>
<img id="book" src="https://upload.wikimedia.org/wikipedia/commons/8/87/Google_Chrome_icon_%282011%29.png" alt="" width="300"/>

Nguồn:

Blogger Plug n Play - Các công cụ và tiện ích jQuery: Cách xem phần tử bị ẩn hoặc hiển thị bằng jQuery


1
@Adrew nhưng liên kết này đang hiển thị ví dụ hoạt động của chức năng này. Tôi nghĩ rằng một câu trả lời thực tế có thể có trọng lượng trên toàn bộ trang văn bản :)
Code Spy

133

Người ta có thể chỉ cần sử dụng thuộc tính hiddenhoặc visible, như:

$('element:hidden')
$('element:visible')

Hoặc bạn có thể đơn giản hóa việc cùng với như sau.

$(element).is(":visible")

130

ebdivnên được đặt thành style="display:none;". Nó hoạt động cho cả chương trình và ẩn:

$(document).ready(function(){
    $("#eb").click(function(){
        $("#ebdiv").toggle();
    });    
});

118

Một câu trả lời khác bạn nên cân nhắc là nếu bạn đang ẩn một phần tử, bạn nên sử dụng jQuery , nhưng thay vì thực sự ẩn nó, bạn xóa toàn bộ phần tử, nhưng bạn sao chép nội dung HTML của nó và chính thẻ vào một biến jQuery, và sau đó tất cả những gì bạn cần làm là kiểm tra nếu có một thẻ như vậy trên màn hình, sử dụng bình thường if (!$('#thetagname').length).


100

Khi kiểm tra một phần tử chống lại :hiddenbộ chọn trong jQuery, cần xem xét rằng một phần tử được định vị tuyệt đối có thể được nhận dạng là ẩn mặc dù các phần tử con của chúng có thể nhìn thấy được .

Điều này có vẻ hơi phản trực quan ngay từ đầu - mặc dù việc xem xét kỹ hơn tài liệu jQuery cung cấp thông tin liên quan:

Các yếu tố có thể được coi là ẩn vì một số lý do: [...] Chiều rộng và chiều cao của chúng được đặt rõ ràng thành 0. [...]

Vì vậy, điều này thực sự có ý nghĩa liên quan đến mô hình hộp và kiểu tính toán cho phần tử. Ngay cả khi chiều rộng và chiều cao không được đặt rõ ràng thành 0, chúng vẫn có thể được đặt hoàn toàn .

Hãy xem ví dụ sau:

console.log($('.foo').is(':hidden')); // true
console.log($('.bar').is(':hidden')); // false
.foo {
  position: absolute;
  left: 10px;
  top: 10px;
  background: #ff0000;
}

.bar {
  position: absolute;
  left: 10px;
  top: 10px;
  width: 20px;
  height: 20px;
  background: #0000ff;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="foo">
  <div class="bar"></div>
</div>


Cập nhật cho jQuery 3.x:

Với jQuery 3, hành vi được mô tả sẽ thay đổi! Các yếu tố sẽ được xem là có thể nhìn thấy nếu chúng có bất kỳ hộp bố trí nào, bao gồm cả các ô có chiều rộng và / hoặc chiều cao bằng không.

JSFiddle với jQuery 3.0.0-alpha1:

http://jsfiddle.net/pM2q3/7/

Mã JavaScript tương tự sau đó sẽ có đầu ra này:

console.log($('.foo').is(':hidden')); // false
console.log($('.bar').is(':hidden')); // false

90

Điều này có thể làm việc:

expect($("#message_div").css("display")).toBe("none");

7
Ngôn ngữ / phương ngữ / thư viện này là gì? Tôi không quen với cú pháp này trong JS ...
nbrooks

74

Thí dụ:

$(document).ready(function() {
  if ($("#checkme:hidden").length) {
    console.log('Hidden');
  }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="checkme" class="product" style="display:none">
  <span class="itemlist"><!-- Shows Results for Fish --></span> Category:Fish
  <br>Product: Salmon Atlantic
  <br>Specie: Salmo salar
  <br>Form: Steaks
</div>


66

Để kiểm tra nếu nó không hiển thị, tôi sử dụng !:

if ( !$('#book').is(':visible')) {
    alert('#book is not visible')
}

Hoặc sau đây cũng là sam, lưu bộ chọn jQuery vào một biến để có hiệu suất tốt hơn khi bạn cần nó nhiều lần:

var $book = $('#book')

if(!$book.is(':visible')) {
    alert('#book is not visible')
}

1
Làm thế nào bạn xác định rằng việc lưu một bộ chọn trong biến thực sự nhanh hơn?
Ilia Rostovtsev

3
Xin chào @Ilia Rostovtsev jsperf.com/caching-jquery-selector Ở đó bạn có thể chạy thử nghiệm. Dù sao, thật tuyệt khi có bộ nhớ cache để có thể truy cập nhanh hơn
Matthias Wegtun

2
Điều này phù hợp nếu bạn muốn sử dụng một biến duy nhất trong suốt quá trình thay vì gọi và gọi cùng một đối tượng.
Kenneth Palaganas

60

Sử dụng lớp bật tắt, không chỉnh sửa kiểu. . .

Sử dụng các lớp được chỉ định cho các phần tử "ẩn" là dễ dàng và cũng là một trong những phương pháp hiệu quả nhất. Chuyển đổi một lớp 'ẩn' với Displaykiểu 'không' sẽ thực hiện nhanh hơn so với chỉnh sửa trực tiếp kiểu đó. Tôi đã giải thích một số điều này khá kỹ lưỡng trong câu hỏi Stack Overflow Biến hai phần tử hiển thị / ẩn trong cùng một div .


Thực tiễn tốt nhất và tối ưu hóa JavaScript

Dưới đây là một video thực sự khai sáng về Google Tech Talk của kỹ sư mặt trận Google Nicholas Zakas:


60

Ví dụ về việc sử dụng kiểm tra hiển thị cho trình chặn quảng cáo được kích hoạt:

$(document).ready(function(){
  if(!$("#ablockercheck").is(":visible"))
    $("#ablockermsg").text("Please disable adblocker.").show();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="ad-placement" id="ablockercheck"></div>
<div id="ablockermsg" style="display: none"></div>

"ablockercheck" là một ID mà trình chặn quảng cáo chặn. Vì vậy, kiểm tra nó nếu nó hiển thị, bạn có thể phát hiện nếu trình chặn quảng cáo được bật.


58

Rốt cuộc, không có ví dụ nào phù hợp với tôi, vì vậy tôi đã tự viết.

Các thử nghiệm (không hỗ trợ Internet Explorer filter:alpha):

a) Kiểm tra xem tài liệu không bị ẩn

b) Kiểm tra xem một phần tử có độ rộng / chiều cao / độ mờ bằng 0 hoặc display:none/ visibility:hiddentrong kiểu nội tuyến không

c) Kiểm tra xem trung tâm (cũng vì nó nhanh hơn kiểm tra mọi pixel / góc) của phần tử không bị ẩn bởi phần tử khác (và tất cả tổ tiên, ví dụ: overflow:hidden/ scroll / một phần tử trên phần tử khác) hoặc cạnh màn hình

d) Kiểm tra xem một phần tử có độ rộng / chiều cao / độ mờ hoặc display:none/ mức độ hiển thị bằng không: ẩn trong các kiểu được tính toán (trong số tất cả các tổ tiên)

Đã thử nghiệm trên

Android 4.4 (Trình duyệt gốc / Chrome / Firefox), Firefox (Windows / Mac), Chrome (Windows / Mac), Opera (Windows Presto / Mac WebKit), Internet Explorer (chế độ tài liệu Internet Explorer 5-11 + Internet Explorer 8 trên một máy ảo) và Safari (Windows / Mac / iOS).

var is_visible = (function () {
    var x = window.pageXOffset ? window.pageXOffset + window.innerWidth - 1 : 0,
        y = window.pageYOffset ? window.pageYOffset + window.innerHeight - 1 : 0,
        relative = !!((!x && !y) || !document.elementFromPoint(x, y));
        function inside(child, parent) {
            while(child){
                if (child === parent) return true;
                child = child.parentNode;
            }
        return false;
    };
    return function (elem) {
        if (
            document.hidden ||
            elem.offsetWidth==0 ||
            elem.offsetHeight==0 ||
            elem.style.visibility=='hidden' ||
            elem.style.display=='none' ||
            elem.style.opacity===0
        ) return false;
        var rect = elem.getBoundingClientRect();
        if (relative) {
            if (!inside(document.elementFromPoint(rect.left + elem.offsetWidth/2, rect.top + elem.offsetHeight/2),elem)) return false;
        } else if (
            !inside(document.elementFromPoint(rect.left + elem.offsetWidth/2 + window.pageXOffset, rect.top + elem.offsetHeight/2 + window.pageYOffset), elem) ||
            (
                rect.top + elem.offsetHeight/2 < 0 ||
                rect.left + elem.offsetWidth/2 < 0 ||
                rect.bottom - elem.offsetHeight/2 > (window.innerHeight || document.documentElement.clientHeight) ||
                rect.right - elem.offsetWidth/2 > (window.innerWidth || document.documentElement.clientWidth)
            )
        ) return false;
        if (window.getComputedStyle || elem.currentStyle) {
            var el = elem,
                comp = null;
            while (el) {
                if (el === document) {break;} else if(!el.parentNode) return false;
                comp = window.getComputedStyle ? window.getComputedStyle(el, null) : el.currentStyle;
                if (comp && (comp.visibility=='hidden' || comp.display == 'none' || (typeof comp.opacity !=='undefined' && comp.opacity != 1))) return false;
                el = el.parentNode;
            }
        }
        return true;
    }
})();

Cách sử dụng:

is_visible(elem) // boolean

50

Bạn cần kiểm tra cả ... Hiển thị cũng như khả năng hiển thị:

if ($(this).css("display") == "none" || $(this).css("visibility") == "hidden") {
    // The element is not visible
} else {
    // The element is visible
}

Nếu chúng tôi kiểm tra $(this).is(":visible"), jQuery sẽ tự động kiểm tra cả hai thứ.


41

Có lẽ bạn có thể làm một cái gì đó như thế này

$(document).ready(function() {
   var visible = $('#tElement').is(':visible');

   if(visible) {
      alert("visible");
                    // Code
   }
   else
   {
      alert("hidden");
   }
});
<script src="https://code.jquery.com/jquery-1.10.2.js"></script>

<input type="text" id="tElement" style="display:block;">Firstname</input>


37

Chỉ cần kiểm tra mức độ hiển thị bằng cách kiểm tra giá trị boolean, như:

if (this.hidden === false) {
    // Your code
}

Tôi đã sử dụng mã này cho từng chức năng. Nếu không, bạn có thể sử dụng is(':visible')để kiểm tra khả năng hiển thị của một yếu tố.


34

Bởi vì Elements with visibility: hidden or opacity: 0 are considered visible, since they still consume space in the layout(như được mô tả cho jQuery: Selector hiển thị ) - chúng ta có thể kiểm tra xem phần tử có thực sự hiển thị theo cách này hay không:

function isElementReallyHidden (el) {
    return $(el).is(":hidden") || $(el).css("visibility") == "hidden" || $(el).css('opacity') == 0;
}

var booElementReallyShowed = !isElementReallyHidden(someEl);
$(someEl).parents().each(function () {
    if (isElementReallyHidden(this)) {
        booElementReallyShowed = false;
    }
});


30

Một chức năng có thể được tạo để kiểm tra các thuộc tính hiển thị / hiển thị để đánh giá xem phần tử đó có được hiển thị trong UI hay không.

function checkUIElementVisible(element) {
    return ((element.css('display') !== 'none') && (element.css('visibility') !== 'hidden'));
}

Fiddle làm việc


29

Ngoài ra đây là một biểu thức điều kiện thứ ba để kiểm tra trạng thái của phần tử và sau đó chuyển đổi nó:

$('someElement').on('click', function(){ $('elementToToggle').is(':visible') ? $('elementToToggle').hide('slow') : $('elementToToggle').show('slow'); });

4
Hoặc, y'kno, chỉ cần thoát khỏi toàn bộ điều kiện và nói $('elementToToggle').toggle('slow');...:)
nbrooks

29
if($('#postcode_div').is(':visible')) {
    if($('#postcode_text').val()=='') {
        $('#spanPost').text('\u00a0');
    } else {
        $('#spanPost').text($('#postcode_text').val());
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.