2015-10-28 5 views
9

Ho un contenitore HTML con alcuni contenuti, tra cui testi nodi e altri tag:jQuery: nascondere tutto in un contenitore, ad eccezione di un nodo

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

voglio usare jQuery per nascondere tutto in tale contenitore, tranne il tag di input.

// Hide all the node 
$("#container").contents().hide(); 

// First try to hide texts 
$("#container").contents().filter(":text").hide(); 
// Second try 
$("#container").contents().filter(function() { 
    return this.nodeType === 3; 
}).hide(); 

// Show the desired element 
$("#container #iii").show(); 

Il collegamento "A link" viene rimosso, ma i testi prima e dopo l'input rimangono ancora.

Qual è il modo giusto per nascondere un testo che è figlio diretto di un elemento DOM?

È possibile play with that example on jsfiddle

+0

Vorrei aggiungere tutto all'interno del contenitore che voglio nascondere all'interno di sotto-contenitori di una classe e tutto ciò che non voglio nascondere all'interno di sotto-contenitori di un'altra classe. Oppure, crea due copie dell'intero contenitore, la seconda copia contiene solo gli elementi che non voglio nascondere e inizia nascosto, o dimentica di nascondere/mostrare e solo l'utente jQuery per generare il contenuto del contenitore in base a qualsiasi condizione tu desiderio. – SunKnight0

+0

qual è la ragione per cui non inserisci testo in nessun tag – Gacci

+0

Il motivo è che non ho il controllo sulla generazione di questo html. È generato da un framework che non sono autorizzato a modificare – Antwane

risposta

4

tuo .hide() non funzionerà sui textnodes, perché uno stile (in questo caso display:none;) deve sempre essere applicato a un tag. Non può essere applicato a un nodo stesso.

Tuttavia, è possibile manipolare il codice HTML con Javascript per aggiungere manualmente campate intorno a questi 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

Poi, se si desidera scoprire i contenuti div in seguito, si può semplicemente rimuovere la classe e lascia le sponde lì (non faranno del male a nessuno).

+0

Se 'html' può essere modificato, non è necessario creare nuovi elementi, potrebbe impostare' # text' node '.nodeValue' per svuotare la stringa' "" ' – guest271314

+0

@ guest271314 Immagino che ci sia un motivo per cui vuole nasconderli invece di rimuoverli. Potrebbe aver bisogno di scoprirli di nuovo in seguito. –

+0

Sì. Potrebbe memorizzare 'nodeValue' come variabile, impostare' nodeValue' sulla variabile salvata quando viene nuovamente visualizzato – guest271314

0

Spero che non ti sto confondendo. Ho postato la mia vecchia risposta perché ero segnato. Per favore concentrati sulla nuova risposta. Se hai accesso ad aggiungere css qui è la soluzione. Altrimenti, è possibile utilizzare JavaScript e aggiungere questo css; trova la posizione e la dimensione del pulsante modifica il css in base alla posizione e alla dimensione. Quindi aggiungi il css usando jQuery. Nota che ho usato il rosa e il rosso solo per mostrarti cosa sto facendo!

$('#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

_ "Viene generato da un framework che non sono autorizzato a modificare" _ http://stackoverflow.com/questions/ 33399264/jquery-hide-everything-in-a-container-except-one-node # comment54590282_33399264 – guest271314

+0

Dopo la modifica, il codice non funzionerà più. –

+0

Ok, cosa vuoi nascondere/mostrare? Ho appena modificato, questo mostra solo il testo non nei tag! – Gacci

3

La ragione è che non ho il controllo sulla generazione di questo html. E 'generata da un quadro io non sono autorizzato a modificare

provare a impostare #container, #container *:not(#iii)csscolor proprietà 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/


Sei autorizzato a modificare l'html tramite javascript?


sì potrebbe essere una soluzione

In alternativa, se htmlpuò essere modificate, potrebbero utilizzare .clone() memorizzare elemento originale come oggetto jQuery, compresi tutti html contenuto all'interno dell'elemento . Utilizzare .each() per iterare i nodi figlio dell'elemento originale, se il nodo ha una proprietà "stile" chiamata .hide() sul nodo figlio, altrimenti impostare il nodo #text.nodeValue nella stringa vuota.

Potrebbe ripristinare html di originale utilizzando clone di elemento originale

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

Problemi correlati