JavaScriptの非表示/表示要素


287

「編集」リンクを押した後、それを非表示にするにはどうすればよいですか?また、編集ボタンを押すと「lorem ipsum」というテキストを非表示にできますか?

<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>

回答:


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
なぜ追加return falseするのonclickですか?
Midas


1
はい、知っています。しかし、#をリンクとして使用する場合には必要ないので、私は不思議に思っていました。
Midas

10
JavaScriptでURLをyourdomain.com/からyourdomain.com/#に変更したくない場合に必要になることがあります。さらに、ウィンドウのスクロールがジャンプしたり、その他の考慮されていない問題が発生したりする場合があります。
Sascha Galley

1
テストのためのリンクがありません。そのため、ここで試すことができます。konzertagentur-koerner.de/testしかし、良いコードに感謝
Timo

69

このコードを使用して、要素を表示/非表示にすることもできます。

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

注との違いはstyle.visibilitystyle.displaydisplay:noneとは異なり、visibility:hiddenを使用する場合です。タグは表示されませんが、ページ上にタグが割り当てられます。タグはレンダリングされますが、ページには表示されません。

違いを確認するには、このリンクを参照してください。


1
どう.hiddenですか?あなたは今それがどのように振る舞うのですか?
jimasun 2016年

41

私はあなたにjQueryオプションを提案したいと思います。

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

例えば:

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

60
JQueryが不要な場合もあります。これがページで行う必要がある唯一のことである場合、ライブラリをロードするオーバーヘッドは、簡潔なJavaScriptを記述する必要性をはるかに上回ります。
GlennG 2014年

2
それは(それを隠すようだ)とアディOsmaniが、ここで説明しているように、一般的にjqueryの可視性の方法は、パフォーマンスの面では良い選択肢ではありません。speakerdeck.com/addyosmani/devtools-state-of-the-union-2015
エミリオ

1
これはうまくいくかもしれませんが、作成者はjQueryを使用していないため、これは質問に対する適切な回答のようには見えません。
A.ウェンツェル2018年

36

要素を非表示にするためにこれをお勧めします(他の人が提案したように):

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

しかし、要素を表示するには、これを推奨します(display = 'block'の代わりに):

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

その理由は、display = 'block'を使用すると、現在作業しているページのIE(11)とChrome(バージョン43.0.2357.130 m)の両方で要素の横に追加のマージン/空白が表示されるためです。

Chromeで最初にページを読み込むとき、style属性のない要素はDOMインスペクターで次のように表示されます。

element.style {
}

標準のJavaScriptを使用して非表示にすると、予想どおり次のようになります。

element.style {
  display: none;
}

display = 'block'を使用して再度表示すると、次のように変更されます。

element.style {
  display: block;
}

元々あったのと同じではありません。これは、ほとんどの場合、まったく違いを生じさせません。しかし、いくつかのケースでは、それは異常をもたらします。

display = ''を使用すると、DOMインスペクタで元の状態に復元されるため、より良いアプローチのようです。


うん!blockオプションを使用しないほうがよいでしょう。この小道具のデフォルト値が何であるか疑問に思っていました:p

18

要素の隠しプロパティを使用できます:

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

おお!私がこれを好きな理由は、あなたがdisplay=""今日異なる値を持っているかもしれないからです。
アンドリュー

残念ながら、CSSスタイルシートではこれを使用できません。したがって、あなたはどちらかHTMLでそれを設定するかの使用結合する必要があるだろうdisplay: none;など
アンドリュー・

警告:CSS displayプロパティが設定されている場合、このプロパティは無視されます。
JasonWoof

1
あなたが設定したい場合はdisplay、それが持っていないときの要素にプロパティをhidden属性を、このようにそれをターゲット:.my-el:not([hidden]) { display: flex }
gitaarik

13

JSは振る舞いを考え、CSSはビジュアルキャンディーをできるだけ考えるべきです。HTMLを少し変更することにより:

<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>

CSSルールを使用するだけで、あるビューから別のビューに切り替えることができます。

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

そして、2つのクラスを切り替えるJSコード

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

9

この質問は以前から何度も回答されていますが、将来のユーザーのために、より完全で確実な回答を付け加えたいと思いました。主な答えは問題を解決しますが、物事を表示/非表示にするさまざまな方法のいくつかを知っている/理解する方が良いかもしれないと思います。

css()を使用して表示を変更する

これは、他の方法がいくつか見つかるまで私が使用していた方法です。

JavaScript:

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

長所:

  • 非表示および再表示。それだけです。

短所:

  • 「display」属性を他のものに使用する場合は、非表示にする前の値をハードコードする必要があります。したがって、「インライン」がある場合は、$("#element_to_hid").css("display", "inline");それ以外の場合は、デフォルトで「ブロック」または強制的に適用されるものに戻ります。
  • タイプミスに向いています。

例: https //jsfiddle.net/4chd6e5r/1/

addClass()/ removeClass()を使用して表示を変更する

この例を設定しているときに、実際にこの方法にいくつかの欠陥があり、非常に信頼性が低くなっています。

Css / Javascript:

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

長所:

  • それは隠れる....時々。例のp1を参照してください。
  • 再表示すると、以前の表示値の使用に戻ります。例のp1を参照してください。
  • すべての非表示オブジェクトを取得したい場合は、実行するだけです$(".hidden")

短所:

  • 表示値がHTMLに直接設定されている場合は非表示にしません。例のp2を参照してください。
  • css()を使用してJavaScriptで表示が設定されている場合、非表示にしません。例のp3を参照してください。
  • css属性を定義する必要があるため、コードが少し増えます。

例:https : //jsfiddle.net/476oha8t/8/

toggle()を使用して表示を変更する

JavaScript:

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

長所:

  • 常に動作します。
  • 切り替え前の状態を気にする必要がありません。これの明らかな使用法は、トグルボタンです。
  • 短くてシンプル。

短所:

  • 直接関係のないことを行うために、どの状態に切り替わっているかを知る必要がある場合は、コード(ifステートメント)を追加して、どの状態にあるかを調べる必要があります。
  • 前の詐欺と同様に、非表示にするためにtoggle()を含む一連の命令を実行したいが、それがすでに非表示になっているかどうかわからない場合は、チェック(ifステートメント)を追加する必要があります。最初に確認し、すでに非表示になっている場合はスキップします。例のp1を参照してください。
  • 前の2つの短所に関連して、具体的に非表示または具体的に表示しているものに対してtoggle()を使用すると、トグルする方法がわからないため、コードを読んでいる他のユーザーを混乱させる可能性があります。

例:https : //jsfiddle.net/cxcawkyk/1/

hide()/ show()を使用して表示を変更する

JavaScript:

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

長所:

  • 常に動作します。
  • 再表示すると、以前の表示値の使用に戻ります。
  • あなたは常にあなたがスワップしている状態を知っているでしょう:
    1. 状態が重要な場合は、状態を変更する前に可視性をチェックするためにifステートメントを追加する必要はありません。
    2. 状態が重要である場合に、どの状態に切り替えるかについて、コードを読んでいる他の人を混乱させません。
  • 直感的。

短所:

  • トグルを模倣する場合は、最初に状態を確認してから、他の状態に切り替える必要があります。代わりにtoggle()を使用してください。例のp2を参照してください。

例:https : //jsfiddle.net/k0ukhmfL/

全体として、特にトグルである必要がない限り、hide()/ show()が最適です。この情報がお役に立てば幸いです。


8
なぜ答えにjQueryを使うことにしたのですか?
Draex_

@Draex_ええ、彼はjavascriptが欲しかったと思いますか?正直なところ、別のスレッドがおそらく意見を述べていたため、私はこのスレッドに自分の答えを移動することを余儀なくされました。私は人々に役立つ情報を提供しようとしていましたが、それを行う場所がないようです。
マケニアの2016

またあります$("#element_to_hide").hidden = true/false
P i

6

次のように、すべての要素に対してメソッドhideおよびshowを自分で作成するだけです

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

この後、これらの例のように、通常の要素識別子を持つメソッドを使用できます。

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

または:

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

5

Javascriptをお勧めします。これは、比較的高速で柔軟なためです。

    <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

テーブルで使用している場合は、次のようにしてください

  <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

クラスとIDのバニラJS

ID別

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

クラス別(単一要素)

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

クラス別(複数要素)

for (let elem of document.querySelectorAll('.element-class-name')) {
    elem.style.display = 'none';
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.