2009-09-30 19 views

risposta

25

Suppongo che si desidera cancellare tutto i bambini, non solo i bambini diretti, quindi dovrebbe essere ricorsivo. Dato che diversi elementi di input vengono cancellati in modo diverso, devi controllare il loro tipo in modo da sapere cosa fare con essi. Suppongo che si desidera cancellare textarea anche, ma i pulsanti lasciare invariato:

function clearChildren(element) { 
    for (var i = 0; i < element.childNodes.length; i++) { 
     var e = element.childNodes[i]; 
     if (e.tagName) switch (e.tagName.toLowerCase()) { 
     case 'input': 
      switch (e.type) { 
       case "radio": 
       case "checkbox": e.checked = false; break; 
       case "button": 
       case "submit": 
       case "image": break; 
       default: e.value = ''; break; 
      } 
      break; 
     case 'select': e.selectedIndex = 0; break; 
     case 'textarea': e.innerHTML = ''; break; 
     default: clearChildren(e); 
     } 
    } 
} 

chiamata con un riferimento all'elemento:

clearChildren(document.getElementById('IdOfTheDiv')); 

Edit:
dimenticato il select ...

Modifica 2:
Alcune correzioni: childNodes.length, gestione di elementi senza tagName e lettere maiuscoleNome valori.

+1

+1, mi piace anche questo – karim79

+1

Buona ipotesi sul fatto di aver bisogno di lavorare sui bambini dei bambini, tuttavia non hai bisogno di ricorsione per afferrare i nodi discendenti. –

+0

Grazie per la risposta !! Sto cercando di implementarlo e ho uno strano sintomo. Non c'è alcun effetto visibile su un semplice modulo di test. Se ottengo alert per stampare elemento ottengo [oggetto HTMLDivElement] (buono ..) Se ottengo alert() per stampare element.childNodes ha [oggetto nodeLIst] (di nuovo buono) ma se ottengo alert() per echo il valore di i dentro il for() non si accende mai così sembra che non iterare sui nodi? Codice come: function clearChildren (elemento) { per (var i = 0; i jerrygarciuh

4

La risposta di Karim funziona bene. Utilizzando jQuery, credo che andrò qualcosa di simile:

$("#myDiv").each(function(){ 
    if($(this).type == "input") 
     $(this).val(''); 
}); 

In realtà, venite a pensarci bene, si può anche provare:

$("#myDiv input").val('');//myDiv is your Div name 
+0

Ho alcuni effetti Scriptaculous alreay in questa pagina. Creerebbe conflitti per caricare anche in jQuery? – jerrygarciuh

+0

è possibile utilizzare quanto segue per evitare interferenze: aggiungere jQuery.noConflict(); nella parte superiore della pagina e sostituisci ogni '$' con la parola jQuery quando si chiama una funzione jQuery. Maggiori informazioni qui: http://docs.jquery.com/Using_jQuery_with_Other_Libraries –

+0

Grazie TTG! Vedrò questo ora! 1 – jerrygarciuh

7

Oh ragazzi, questo sarebbe un uno di linea con jQuery:

$(':input:not(:button)', div).val([]) 

Senza jQuery hai avuto modo di spiegare <select> campi, campi di testo, campi di password e campi radio/checkbox:

function clearFields(container) { 
    var selects = container.getElementsByTagName('select'); 

    for(var i=0, len=selects.length; i < len; i++) { 
     selects[i].selectedIndex = -1; 
    } 

    var fields = container.getElementsByTagName('input'); 
    for(var i=0, len=fields.length; i < len; i++) { 
     var field = fields[i]; 
     switch(field.type) 
     { 
      case 'radio': 
      case 'checkbox': 
       field.checked = false; 
       break; 

      case 'text': 
      case 'password': 
      case 'hidden': 
       field.value = '' 
     } 
    } 

    var fields = container.getElementsByTagName('textarea'); 
    for(var i=0, len=fields.length; i < len; i++) { 
     fields[i].value = '' 
    } 
} 
+0

+1, mi piace questo – karim79

+0

La soluzione jQuery non gestisce caselle di controllo o pulsanti di opzione e cancella il testo dei pulsanti ... – Guffa

+0

@Guffa: la soluzione jQuery funziona correttamente ora;) –

14

Molto semplice con jQuery:

$('#myDiv').children().find('input,select').each(function(){ 
    $(this).val(''); 
}); 

possiamo mettere il maggior numero di tag nel "trovare" chiamare.

+0

Grazie Haresh! Che eccellente aggiunta a questa discussione! – jerrygarciuh

+0

bello ... mi chiedo solo se puoi farlo senza figli()? ad esempio: $ ('# myDiv'). find ('input, select'). each (function() { $ (this) .val (''); }); – Vikram

2

Complimenti, Haresh! Piccola aggiunta per deselezionare le caselle di controllo. (Utilizzare vero per controllare tutto.)

$('#myDiv').children().find('input,select').each(function(){ 

$(this).val(''); 
$(this).attr('checked',false); 

}); 
0
$('#div_id input[type=textbox], #div_id select, #div_id textarea').val(''); 
$('#div_id input[type=radio], #div_id input[type=checkbox]').prop('checked', false); 

per jQuery.

1

Utilizzare il seguente codice per eliminare ogni tipo di ingresso elementi forma di valore

function clear_form_elements(id_name) { 
    jQuery("#"+id_name).find(':input').each(function() { 
    switch(this.type) { 
     case 'password': 
     case 'text': 
     case 'textarea': 
     case 'file': 
     case 'select-one':  
      jQuery(this).val(''); 
      break; 
     case 'checkbox': 
     case 'radio': 
      this.checked = false; 
    } 
    }); 
} 
Problemi correlati