Hàm :visible Selector trong jQuery

Visible Selector sẽ lựa chọn tất cả các phần tử có thể thấy được. Nói cách khác nó sẽ lựa chọn tất cả các phần tử không bị ẩn đi ( ngược lại so với :hidden).

Các phần tử được xem là hiển thị khi chúng có chiếm không gian trong tài liệu, các phần tử hiển thị sẽ có width hoặc height lớn hơn 0.

Các phần tử được thiết lập visibility: hidden hoặc opacity: 0 vẫn được coi là các phần tử hiển thị vì chúng vẫn chiếm không gian trong tài liệu.

Các phần tử không nằm trong tài liệu không được coi là có hiển thị, Jquery không có cách nào để biết chúng có thể hiển thị hay không khi nối vào tài liệu vì còn phụ thuộc vào các kiểu phù hợp.

Selector này là nghịch đảo của :hidden selector vì vậy những phần tử được chọn bởi nó sẽ không thể được chọn bởi :hidden selector.

Các phần tử option của thẻ select được coi là ẩn kể cả khi chúng được selected.

Trong suốt quá trình chuyển động của một phần tử, nó được xem là hiển thị khi bắt đầu chuyển động.

Trong Jquery 1.3.2 một phần tử được xem là ẩn khi nó hoặc bất cứ phần tử cha nào của nó không tiêu tốn không gian trong tài liệu.Tính năng hiển thị CSS sẽ không được tính đến(do đó $( elem ).css( "visibility", "hidden" ).is( ":hidden" ) == false) .

Jquery 3 đã thay đổi một chút về ý nghĩa của :hidden do vậy sẽ ảnh hưởng đến :visible. Một phần tử được xem là ẩn khi nó không được chứa bởi bất cứ vùng nào trên trang. Ví dụ, thẻ br sẽ  được chọn bởi :visible selector.

Chú ý:

  • Bởi vì :visible là một Jquery extension và không phải là một phần thiết lập của CSS, các truy vấn sử dụng :visible sẽ không thể phát huy hiệu quả của phương thức querySelectorAll(). Để đạt được hiệu quả cao nhất khi sử dụng,  bạn nên sử dụng một selector được thiết lập bởi css trước sau đó sử dụng :visible để lọc lại kết quả chính xác.
  • Việc sử dụng selector này sẽ làm giảm hiệu suất vì nó yêu cầu trình duyệt phải render lại trang trước khi nó có thể xác định đâu là phần tử bị ẩn đi. Theo dõi sự hiện thị của các phần tử thông qua cách khác (ví dụ như class) có thể gia tăng tốc độ của trang.

Cú pháp

Cú pháp
jQuery( ":visible" )

Ví dụ

Cùng xem ví dụ sau đây:

Code RUN
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Học lập trình miễn phí tại freetuts.net</title>
        <script src="https://freetuts.net/cnd/js/jquery/jquery-3.2.1.min.js"></script>
        <style type="text/css">
            div {
                width: 50px;
                height: 40px;
                margin: 5px;
                border: 3px outset green;
                float: left;
            }
            .starthidden {
                display: none;
            }   
        </style>
    </head>
    <body>
        <h1>Học lập trình miễn phí tại freetuts.net</h1>
        <div></div>
        <div class="starthidden"></div>
        <div></div>
        <div></div>
        <div style="display:none;"></div>
        <br>
        <button>Hiển thị các thẻ div bị ẩn</button>
        <script>
            $( "button" ).click(function() {
              $( "div:hidden" ).show( "fast" );
            }); 

            $( "div:visible" ).click(function() {
              $( this ).css( "background", "yellow" );
            });
        </script>
    </body>
</html>

Kết quả:

Giải thích một chút, khi click button, các phần tử bị ẩn đi sẽ được div:hidden chọn và hiển thị chúng.

Tiếp đó, nếu bạn click các thẻ div hiển thị từ trước, chúng sẽ được div:visible chọn và đổi màu nền cho thẻ được click.

Ở đây sẽ có bạn đặt ra thắc mắc, nếu mình click button trước thì khi đó các phần tử :hidden đã được hiển thị rồi, tại sao nó không được :visible lựa chọn ? 

Để hiểu được điều này các bạn phải hiểu được quá trình biên dịch của Javascript, nó sẽ load hết code trong thẻ <script> trước khi bạn click, lúc này các thẻ div bị ẩn chưa được lựa chọn bởi :visible nên sau khi nó được hiển thị nó vẫn sẽ không được chọn bởi :visible vì trang không hề được load lại.

Để kiểm chứng các bạn đặt lại đoạn script như sau:

Code RUN
$( "button" ).click(function() {
    $( "div:hidden" ).show( "fast" );

    $( "div:visible" ).click(function() {
      $( this ).css( "background", "red" );
    });
});

Kết quả:

click thử vào tất cả các thẻ div, kết quả đã khác phải không nào. Lí do ở đây là vì mình đã đặt đoạn gán sự kiện cho các thẻ div vào trong sự kiện click button, mỗi khi click button, các phần tử đang ẩn sẽ được hiển thị bởi $( "div:hidden" ).show( "fast" );, sau đó, :visible sẽ chạy lại một lần để tìm kiếm các phần tử được hiển thị và gán sự kiện click cho nó. Do vậy, tất cả các thẻ div sẽ được gán sự kiện click.

Hi vọng các bạn đã hiểu rõ được cách thức hoạt động của :visible và :hidden, chúc các bạn thành công.

Tham khảo: jquery.com

Kết quả:

Nguồn: freetuts.net