Phần tử ẩn / hiển thị JavaScript


287

Làm cách nào tôi có thể ẩn liên kết 'Chỉnh sửa' sau khi tôi nhấn nó? và tôi cũng có thể ẩn văn bản "lorem ipsum" khi nhấn chỉnh sửa không?

<script type="text/javascript">
function showStuff(id) {
  document.getElementById(id).style.display = 'block';
}
</script>


<td class="post">

  <a href="#" onclick="showStuff('answer1'); return false;">Edit</a>
  <span id="answer1" style="display: none;">
    <textarea rows="10" cols="115"></textarea>
  </span>

  Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum 
</td>

Câu trả lời:


454

function showStuff(id, text, btn) {
    document.getElementById(id).style.display = 'block';
    // hide the lorem ipsum text
    document.getElementById(text).style.display = 'none';
    // hide the link
    btn.style.display = 'none';
}
<td class="post">

<a href="#" onclick="showStuff('answer1', 'text1', this); return false;">Edit</a>
<span id="answer1" style="display: none;">
<textarea rows="10" cols="115"></textarea>
</span>

<span id="text1">Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum</span>
</td>


5
Tại sao bạn thêm return falsevào onclick?
Midas


1
Vâng tôi biết. Nhưng tôi đã tự hỏi bởi vì nó không cần thiết trong trường hợp bạn sử dụng # làm liên kết.
Midas

10
Có thể cần thiết nếu bạn không muốn để JavaScript thay đổi url từ yourdomain.com/ thành yourdomain.com/# ... hơn nữa, việc cuộn cửa sổ có thể nhảy hoặc bất kỳ vấn đề không được xem xét nào khác có thể xảy ra.
Sascha Galley

1
Tôi bỏ lỡ một liên kết để kiểm tra đó là lý do tại sao bạn có thể thử ở đây: konzertagentur-koerner.de/test Nhưng cảm ơn vì mã tốt
Timo

69

Bạn cũng có thể sử dụng mã này để hiển thị / ẩn các phần tử:

document.getElementById(id).style.visibility = "hidden";
document.getElementById(id).style.visibility = "visible";

Lưu ý Sự khác biệt giữa style.visibilitystyle.displaylà khi sử dụng mức độ hiển thị: ẩn không giống như hiển thị: không có, thẻ không hiển thị, nhưng không gian được phân bổ cho nó trên trang. Thẻ được hiển thị, nó không được nhìn thấy trên trang.

Xem liên kết này để thấy sự khác biệt.


1
Thế còn .hidden? Bạn có làm thế nào nó cư xử?
jimasun

41

Tôi muốn đề nghị bạn tùy chọn JQuery .

$("#item").toggle();
$("#item").hide();
$("#item").show();

Ví dụ:

$(document).ready(function(){
   $("#item").click(function(event){
     //Your actions here
   });
 });

60
Đôi khi JQuery không cần thiết; nếu đây là điều duy nhất bạn cần làm trên một trang, thì chi phí tải thư viện vượt xa nhu cầu viết JavaScript súc tích.
GlennG

2
Có vẻ như các phương thức hiển thị ẩn () và jquery nói chung không phải là một lựa chọn tốt về mặt hiệu suất, như Addy Osmani giải thích ở đây: loadeck.com/addyosmani/devtools-state-of-the-union-2015
Emilio

1
trong khi điều này có thể hoạt động, tác giả không sử dụng jQuery vì vậy đây có vẻ không phải là câu trả lời phù hợp cho câu hỏi.
A. Wentzel

36

Tôi sẽ đề nghị điều này để ẩn các yếu tố (như những người khác đã đề xuất):

document.getElementById(id).style.display = 'none';

Nhưng để hiển thị các phần tử, tôi đề xuất điều này (thay vì display = 'block'):

document.getElementById(id).style.display = '';

Lý do là việc sử dụng display = 'block' sẽ gây ra lề / khoảng trắng bổ sung bên cạnh phần tử được hiển thị trong cả IE (11) và Chrome (Phiên bản 43.0.2357.130 m) trên trang tôi đang làm việc.

Khi bạn tải trang đầu tiên trong Chrome, một phần tử không có thuộc tính kiểu sẽ xuất hiện như thế này trong trình kiểm tra DOM:

element.style {
}

Ẩn nó bằng cách sử dụng JavaScript tiêu chuẩn làm cho nó như thế này, như mong đợi:

element.style {
  display: none;
}

Làm cho nó hiển thị lại bằng cách sử dụng display = 'block' thay đổi nó thành:

element.style {
  display: block;
}

Mà không giống như ban đầu. Điều này rất có thể không làm cho bất kỳ sự khác biệt trong phần lớn các trường hợp. Nhưng trong một số trường hợp, nó không giới thiệu bất thường.

Sử dụng display = '' sẽ khôi phục nó về trạng thái ban đầu trong trình kiểm tra DOM, vì vậy có vẻ như cách tiếp cận tốt hơn.


Vâng! tốt hơn hết là không sử dụng blocktùy chọn. đã tự hỏi giá trị mặc định của prop này là gì: p

18

bạn có thể sử dụng thuộc tính ẩn của phần tử:

document.getElementById("test").hidden=true;
document.getElementById("test").hidden=false

Ôi! Lý do tôi thích điều này là bởi vì bạn có thể có các display=""giá trị khác nhau hiện nay.
Andrew

Thật không may, dường như bạn không thể sử dụng điều này trong biểu định kiểu CSS. Do đó, bạn phải đặt nó trong HTML hoặc kết hợp sử dụng, display: none;v.v.
Andrew

Hãy cẩn thận: thuộc tính này bị bỏ qua nếu thuộc tính CSS displayđược đặt.
JasonWoust

1
Nếu bạn muốn đặt thuộc displaytính thành một phần tử khi nó không có hiddenthuộc tính, hãy nhắm mục tiêu nó như thế này:.my-el:not([hidden]) { display: flex }
gitaarik

13

Bạn nên nghĩ rằng JS cho hành vi và CSS cho kẹo trực quan càng nhiều càng tốt. Bằng cách thay đổi HTML của bạn một chút:

<td class="post">
    <a class="p-edit-btn" href="#" onclick="showStuff(this.parentNode);return false;">Edit</a>
    <span id="answer1" class="post-answer">
       <textarea rows="10" cols="115"></textarea>
    </span>
    <span class="post-text" id="text1">Lorem ipsum ... </span>
</td>

Bạn sẽ có thể chuyển từ chế độ xem này sang chế độ khác bằng cách sử dụng các quy tắc CSS:

td.post-editing > a.post-edit-btn,
td.post-editing > span.post-text,
td.post > span.post-answer
{
    display : none;
}

Và mã JS chuyển đổi giữa hai lớp

<script type="text/javascript">
function showStuff(aPostTd) {
    aPostTd.className="post-editing";
}
</script>

9

Mặc dù câu hỏi này đã được trả lời nhiều lần trước đây, tôi nghĩ rằng tôi sẽ thêm vào nó với một câu trả lời đầy đủ và chắc chắn hơn cho người dùng trong tương lai. Câu trả lời chính không giải quyết được vấn đề, nhưng tôi tin rằng có thể tốt hơn để biết / hiểu một số cách khác nhau để hiển thị / ẩn mọi thứ.

.

Thay đổi hiển thị bằng css ()

Đây là cách tôi đã từng làm cho đến khi tôi tìm thấy một số cách khác.

Javascript:

$("#element_to_hide").css("display", "none");  // To hide
$("#element_to_hide").css("display", "");  // To unhide

Ưu điểm:

  • Ẩn và không che giấu. Đó là về nó.

Nhược điểm:

  • Nếu bạn sử dụng thuộc tính "hiển thị" cho mục đích khác, bạn sẽ phải mã hóa giá trị của giá trị trước khi ẩn. Vì vậy, nếu bạn có "nội tuyến", bạn sẽ phải làm $("#element_to_hid").css("display", "inline");nếu không nó sẽ mặc định trở lại "chặn" hoặc bất cứ điều gì khác mà nó sẽ bị ép buộc.
  • Cho vay chính tả.

Ví dụ: https://jsfiddle.net/4chd6e5r/1/

.

Thay đổi hiển thị bằng addClass () / removeClass ()

Trong khi thiết lập ví dụ cho cái này, tôi thực sự gặp phải một số sai sót trong phương pháp này khiến nó rất không đáng tin cậy.

Css / Javascript:

.hidden {display:none}
$("#element_to_hide").addClass("hidden");  // To hide
$("#element_to_hide").removeClass("hidden");  // To unhide

Ưu điểm:

  • Nó giấu .... đôi khi. Tham khảo p1 trên ví dụ.
  • Sau khi bỏ ẩn, nó sẽ quay trở lại sử dụng giá trị hiển thị trước đó .... đôi khi. Tham khảo p1 trên ví dụ.
  • Nếu bạn muốn lấy tất cả các đối tượng ẩn, bạn chỉ cần làm $(".hidden").

Nhược điểm:

  • Không ẩn nếu giá trị hiển thị được đặt trực tiếp trên html. Tham khảo p2 trên ví dụ.
  • Không ẩn nếu màn hình được đặt trong javascript bằng css (). Tham khảo p3 trên ví dụ.
  • Mã nhiều hơn một chút vì bạn phải xác định một thuộc tính css.

Ví dụ: https://jsfiddle.net/476oha8t/8/

.

Thay đổi hiển thị bằng cách sử dụng chuyển đổi ()

Javascript:

$("element_to_hide").toggle();  // To hide and to unhide

Ưu điểm:

  • Luôn luôn làm việc.
  • Cho phép bạn không phải lo lắng về trạng thái trước khi chuyển đổi. Việc sử dụng rõ ràng cho việc này là cho một nút .... chuyển đổi.
  • Ngắn gọn và đơn giản.

Nhược điểm:

  • Nếu bạn cần biết nó đang chuyển sang trạng thái nào để làm điều gì đó không liên quan trực tiếp, bạn sẽ phải thêm nhiều mã (một câu lệnh if) để tìm hiểu trạng thái của nó.
  • Tương tự như con lừa trước, nếu bạn muốn chạy một bộ hướng dẫn có chứa nút chuyển đổi () cho mục đích ẩn, nhưng bạn không biết nếu nó đã bị ẩn, bạn phải thêm một kiểm tra (một câu lệnh if) để tìm hiểu đầu tiên và nếu nó đã bị ẩn, sau đó bỏ qua. Tham khảo p1 của ví dụ.
  • Liên quan đến 2 nhược điểm trước đó, sử dụng toggle () cho thứ gì đó được ẩn hoặc hiển thị cụ thể, có thể gây nhầm lẫn cho người khác đọc mã của bạn vì họ không biết họ sẽ chuyển đổi theo cách nào.

Ví dụ: https://jsfiddle.net/cxcawkyk/1/

.

Thay đổi hiển thị bằng cách sử dụng ẩn () / show ()

Javascript:

$("#element_to_hide").hide();  // To hide
$("#element_to_hide").show();  // To show

Ưu điểm:

  • Luôn luôn làm việc.
  • Sau khi bỏ ẩn, nó sẽ quay trở lại sử dụng giá trị hiển thị trước đó.
  • Bạn sẽ luôn biết bạn đang hoán đổi trạng thái nào để bạn:
    1. không cần thêm nếu câu lệnh để kiểm tra mức độ hiển thị trước khi thay đổi trạng thái nếu trạng thái có vấn đề.
    2. sẽ không gây nhầm lẫn cho người khác đọc mã của bạn về trạng thái mà bạn đang chuyển sang nếu, nếu trạng thái đó quan trọng.
  • Trực giác.

Nhược điểm:

  • Nếu bạn muốn bắt chước một chuyển đổi, bạn sẽ phải kiểm tra trạng thái trước và sau đó chuyển sang trạng thái khác. Sử dụng chuyển đổi () thay vì cho những điều này. Tham khảo p2 của ví dụ.

Ví dụ: https://jsfiddle.net/k0ukhmfL/

.

Nhìn chung, tôi sẽ nói tốt nhất là ẩn () / show () trừ khi bạn đặc biệt cần nó để chuyển đổi. Tôi hy vọng bạn tìm thấy thông tin này là hữu ích.


8
Tại sao bạn quyết định sử dụng jQuery trong câu trả lời của bạn?
Draex_

@Draex_ Vâng, tôi cho rằng anh ấy muốn javascript phải không? Thành thật mà nói, tôi đã buộc phải chuyển câu trả lời của mình cho chủ đề này bởi vì một chủ đề khác được cho là có ý kiến. Tôi chỉ cố gắng cung cấp một số thông tin hữu ích cho mọi người, nhưng dường như không có nơi nào để làm điều đó.
Macainian

Ngoài ra còn có$("#element_to_hide").hidden = true/false
P i

6

Chỉ cần tạo ẩn và hiển thị phương thức cho tất cả các yếu tố, như sau

Element.prototype.hide = function() {
    this.style.display = 'none';
}
Element.prototype.show = function() {
    this.style.display = '';
}

Sau này, bạn có thể sử dụng các phương thức với các định danh phần tử thông thường như trong các ví dụ sau:

document.getElementByTagName('div')[3].hide();
document.getElementById('thing').show();

hoặc là:

<img src="removeME.png" onclick="this.hide()">

5

Tôi khuyên dùng Javascript, vì nó tương đối nhanh và dễ uốn hơn.

    <script>
function showStuff(id, text, btn) {
document.getElementById(id).style.display = 'block';
// hide the lorem ipsum text
document.getElementById(text).style.display = 'none';
// hide the link
btn.style.display = 'none';
}
</script>


<td class="post">

<a href="#" onclick="showStuff('answer1', 'text1', this); return false;">Edit</a>
<span id="answer1" style="display: none;">
<textarea rows="10" cols="115"></textarea>
</span>

<span id="text1">Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum</span>
</td>

3

Nếu bạn đang sử dụng nó trong bảng, hãy sử dụng: -

  <script type="text/javascript">
   function showStuff(id, text, btn) {
    document.getElementById(id).style.display = 'table-row';
    // hide the lorem ipsum text
    document.getElementById(text).style.display = 'none';
    // hide the link
    btn.style.display = 'none';
}
</script>


<td class="post">

<a href="#" onclick="showStuff('answer1', 'text1', this); return false;">Edit</a>
<span id="answer1" style="display: none;">
<textarea rows="10" cols="115"></textarea>
</span>

<span id="text1">Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum</span>
</td>

1

Vanilla JS cho các lớp và ID

Bằng ID

document.querySelector('#element-id').style.display = 'none';

Theo lớp (Phần tử đơn)

document.querySelector('.element-class-name').style.display = 'none';

Theo lớp (Nhiều yếu tố)

for (let elem of document.querySelectorAll('.element-class-name')) {
    elem.style.display = 'none';
}
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.