Cómo obtener todas las entradas secundarias de un elemento div (jQuery)

158

HTML:

<div id="panel">
  <table>
    <tr>
       <td><input id="Search_NazovProjektu" type="text" value="" /></td>
    </tr>
    <tr>
       <td><input id="Search_Popis" type="text" value="" /></td>
    </tr>
  </table>
</div>

Necesito seleccionar todas las entradas en el div particular.

Esto no funciona:

var i = $("#panel > :input");
usuario137348
fuente

Respuestas:

301

Úselo sin el mayor que:

$("#panel :input");

Los >medios solo dirigen hijos del elemento, si desea todos los hijos, sin importar la profundidad, simplemente use un espacio.

Nick Craver
fuente
3
Interesante ... Ahora estoy confundido ... El :es para pseudo-clases, ¿no? Pero queremos seleccionar un tipo de elemento. ¿Por qué el :?
mnemosyn
11
@mnemosyn: este es otro tipo de selector como `: casilla de verificación ', consulte aquí para más detalles: api.jquery.com/input-selector Y aquí hay una lista más completa de estos: api.jquery.com/category/selectors/form -selectores
Nick Craver
74

Necesitas

var i = $("#panel input"); 

o , dependiendo de lo que quieras exactamente (ver más abajo)

var i = $("#panel :input"); 

el >restringirá a los niños, desea que todos los descendientes.

EDITAR: Como Nick señaló, hay una sutil diferencia entre $("#panel input")y $("#panel :input).

La primera de ellas sólo se recuperará elementos de entrada de tipo, que es <input type="...">, pero no <textarea>, <button>y <select>elementos. Gracias Nick, no lo sabía y corrigí mi publicación en consecuencia. Dejé ambas opciones, porque supongo que el OP tampoco estaba al tanto de eso y, técnicamente, pidió entradas ... :-)

mnemosyn
fuente
Entonces, ¿input seleccionará todos los campos input / select / textarea? ¿De repente?
Yuri
Básicamente sí. El selector devuelve una matriz de partidos, así que supongo que se podría decir que lo hace 'a la vez', aunque no estoy completamente seguro de lo que quiere decir con eso ...
mnemosyn
1
Quiero decir, "todos juntos" con solo ese selector. ": selector de entrada Descripción: Selecciona todos los elementos de entrada, área de texto, selección y botón". No lo sabía, lo usaré de ahora en adelante :)
Yuri
50

El método 'find' puede usarse para obtener todas las entradas secundarias de un contenedor que ya se ha almacenado en caché para guardar la búsqueda nuevamente (mientras que el método 'children' solo obtendrá los hijos inmediatos). p.ej

var panel= $("#panel");
var inputs = panel.find("input");
Rob Willis
fuente
55
Esto fue perfecto para mí: estoy recorriendo elementos usando .each (), lo que significa que dentro del ciclo accedo al elemento actual usando $ (this). Como resultado, no puedo realizar mucho de lo que se sugiere en las respuestas. - En cambio, puedo hacer $ (this) .find ("input"); Gracias.
djbp
29

Si está utilizando un marco como Ruby on Rails o Spring MVC, es posible que necesite usar divs con llaves cuadradas u otros caracteres, que no está permitido que pueda usar document.getElementByIdy esta solución aún funciona si tiene múltiples entradas con el mismo tipo.

var div = document.getElementById(divID);
$(div).find('input:text, input:password, input:file, select, textarea')
        .each(function() {
            $(this).val('');
        });
$(div).find('input:radio, input:checkbox').each(function() {
    $(this).removeAttr('checked');
    $(this).removeAttr('selected');
});

Este ejemplo muestra cómo borrar las entradas, por ejemplo, tendrá que cambiarlo.

Paulo Fidalgo
fuente
9
var i = $("#panel input");

Deberia trabajar :-)

the> solo buscará niños directos, no hijos de niños
the: es para usar pseudo-clases, por ejemplo. : desplazarse, etc.

Puede leer acerca de los css-selectores disponibles de pseudo-clases aquí: http://docs.jquery.com/DOM/Traversing/Selectors#CSS_Selectors

Phil Rykoff
fuente
66
@henchman - también :inputes un selector, api.jquery.com/category/selectors/form-selectors Si tuviera un <textarea>botón o inputno lo encontraría, lo :inputharía, entonces hay una diferencia.
Nick Craver
+1, por lo que dejar fuera> hará el truco. ahora también lo encontré en la página que recomendé ...
Phil Rykoff
9

Aquí está mi enfoque:

Puedes usarlo en otro evento.

var id;
$("#panel :input").each(function(e){	
  id = this.id;
  // show id 
  console.log("#"+id);
  // show input value 
  console.log(this.value);
  // disable input if you want
  //$("#"+id).prop('disabled', true);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="panel">
  <table>
    <tr>
       <td><input id="Search_NazovProjektu" type="text" value="Naz Val" /></td>
    </tr>
    <tr>
       <td><input id="Search_Popis" type="text" value="Po Val" /></td>
    </tr>
  </table>
</div>

Uttam Kumar Roy
fuente