2015-10-28 6 views
9

ich einen HTML-Container mit einigen Inhalten, einschließlich Texte Knoten und anderen Tags:jQuery: verstecken alles in einem Behälter, außer einem Knoten

<div id="container"> 
    A text outside any tag<br/> 
    <input type="button" id="iii" value="xxx"/> 
    Another text<br/> 
    <a href="#">A link</a> 
</div> 

Ich möchte jQuery verwenden, um alles in diesem Behälter mit Ausnahme der verstecken Eingabe-Tag

Der Link "Eine Verknüpfung" wird entfernt, aber die Texte vor und nach der Eingabe bleiben erhalten.

Was ist der richtige Weg, um einen Text zu verbergen, der ein direktes Kind eines DOM-Elements ist?

Sie können play with that example on jsfiddle

+0

Ich würde alles innerhalb des Containers hinzufügen, den ich in Subcontainern einer Klasse und alles verstecken möchte, was ich nicht in Subcontainern eines anderen verstecken möchte. Oder, erstellen Sie zwei Kopien des gesamten Containers, die zweite Kopie enthält nur die Elemente, die ich nicht verstecken möchte und versteckt, oder vergessen Sie ausblenden/show und nur Benutzer jQuery den Inhalt des Containers basierend auf was auch immer Bedingungen Sie generieren Wunsch. – SunKnight0

+0

was ist der Grund für Sie, keinen Text in irgendein Tag zu setzen – Gacci

+0

Der Grund ist, ich habe keine Kontrolle über die Generierung dieses HTML. Es wird von einem Framework generiert, das ich nicht zum Ändern berechtigt bin. – Antwane

Antwort

4

Ihre .hide() wird auf den textnodes nicht funktionieren, weil ein Stil (in diesem Fall display:none;) immer angewendet werden muss zu einem Tag. Es kann nicht auf einen Knoten selbst angewendet werden.

Allerdings können Sie den HTML-Code mit Javascript manipulieren, um manuell Spannweiten hinzufügen, um diese textnodes:

// Get all the nodes in the container and loop over them 
var allNodes = document.getElementById("container").childNodes; 
for (i = 0; i < allNodes.length; i++) { 
    var item = allNodes[i]; 

    if(item.tagName){ 
     // It already has a proper tag, so just hide it with a class 
     $(item).addClass("hidden"); 
    }else{ 
     // Add a span around it 
     $(item).wrap("<span class='hidden'>"); 
    } 
} 

$("#container #iii").removeClass("hidden"); 

JSFiddle

Dann, wenn Sie später die div Inhalt sichtbar machen möchten, können Sie einfach die Klasse entfernen und lass die Spannweiten dort (sie werden niemanden verletzen).

+0

Wenn 'html' geändert werden kann, ist es nicht notwendig neue Elemente zu erstellen, könnte' # text' Knoten '.nodeValue' auf den leeren String' "'' ' – guest271314

+0

@ guest271314 Ich vermute, es gibt einen Grund, warum er sie verstecken will anstatt sie zu entfernen. Möglicherweise muss er sie danach wieder einblenden. –

+0

Ja. Könnte 'nodeValue' als Variable speichern, setze' nodeValue' auf die gespeicherte Variable, wenn sie wieder angezeigt wird – guest271314

0

Ich hoffe, ich bin verwirrend Sie nicht. Ich habe meine alte Antwort gepostet, weil ich abgemeldet war. Bitte konzentrieren Sie sich auf die neue Antwort. Wenn Sie Zugriff auf das Hinzufügen von CSS haben, ist dies die Lösung. Andernfalls können Sie JavaScript verwenden und dieses CSS hinzufügen. Der Standort und die Größe der Schaltfläche "Suche" ändern die CSS nach Ort und Dimension. Fügen Sie dann das CSS mit jQuery hinzu. Beachte, dass ich pink und rot benutzt habe, um dir zu zeigen, was ich tue!

$('#container :not(label)').hide();
#container2 { 
 
    border: 1px solid red; 
 
    position: relative; 
 
} 
 
#container2:before{ 
 
    content: '\0020'; 
 
    width: 142px; 
 
    height: 17.5px; 
 
    position: absolute; 
 
    top:0px; 
 
    left: 0px; 
 
    background: pink; 
 
} 
 
#container2:after{ 
 
    content: '\0020'; 
 
    width: 315px; 
 
    height: 17.5px; 
 
    position: absolute; 
 
    top: 20px; 
 
    left: 40px; 
 
    background: red; 
 
    z-index: 99; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- This is my old answer --> 
 
<div id="container2"> 
 
    <label>A text outside any tag</label><br/> 
 
    <input type="button" id="iii" value="xxx"/> 
 
    <label>Another text</label><br/> 
 
    <a href="#">A link</a> 
 
</div> 
 

 

 
<!-- This is the new answer --> 
 
<br/><br/> 
 
<div id="container"> 
 
    A text outside any tag<br/> 
 
    <input type="button" id="iii" value="xxx"/> 
 
    Another text<br/> 
 
    <a href="#">A link</a> 
 
</div>

+0

_" Es wird von einem Framework erzeugt, das ich nicht bearbeiten darf "_ http://stackoverflow.com/questions/ 33399264/jquery-hide-Alles-in-einem-Container-außer-einem-Knoten # comment54590282_33399264 – guest271314

+0

Nach Ihrer Bearbeitung wird der Code nicht mehr funktionieren. –

+0

Ok, was willst du verstecken/zeigen? Ich habe gerade geändert, dass nur Text nicht in Tags angezeigt wird! – Gacci

3

Der Grund ist, ich habe keine Kontrolle über die Erzeugung dieses html. Es wird von einem Rahmen generiert wird ich nicht ändern

Versuchen Sie, #container, #container *:not(#iii)csscolor Eigenschaft transparent

$("#container, #container *:not(#iii)").css("color", "transparent")
#container { 
 
    border: 1px solid red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div id="container"> 
 
    A text outside any tag<br/> 
 
    <input type="button" id="iii" value="xxx"/> 
 
    Another text<br/> 
 
    <a href="#">A link</a> 
 
</div>

jsfiddle https://jsfiddle.net/h7yuq8b6/10/

autorisierte

Sind Sie berechtigt, den HTML-Code durch Javascript zu ändern?


ja es

Alternativ kann eine Lösung

sein könnte, wenn html kann modifiziert werden könnte .clone() nutzen ursprüngliche Element als jQuery-Objekt zu speichern, einschließlich aller html Inhalt innerhalb Element . Verwenden Sie .each(), um untergeordnete Knoten des ursprünglichen Elements zu iterieren, wenn der Knoten die Eigenschaft "style" hat, rufen Sie auf dem untergeordneten Knoten auf, andernfalls setzen Sie #text Knoten .nodeValue auf leere Zeichenfolge.

konnte html original mit Klon des ursprünglichen Elements zurückgesetzt

// save orginal `html` 
 
var clone = $("#container").clone(); 
 

 
$("#container").contents().filter(function() { 
 
    return this.nodeType === 3 || this.id !== "iii" 
 
}).each(function() { 
 
    if ("style" in this) { 
 
    $(this).hide() 
 
    } else { 
 
    this.nodeValue = "" 
 
    } 
 
})
#container { 
 
    border: 1px solid red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div id="container"> 
 
    A text outside any tag<br/> 
 
    <input type="button" id="iii" value="xxx"/> 
 
    Another text<br/> 
 
    <a href="#">A link</a> 
 
</div>

Verwandte Themen