jQuery - determina se o elemento de entrada é caixa de texto ou lista de seleção

88

Como eu determinaria se o elemento retornado por um filtro: input em jQuery é uma caixa de texto ou lista de seleção?

Quero ter um comportamento diferente para cada um (a caixa de texto retorna o valor do texto, a seleção retorna a chave e o texto)

Configuração de exemplo:

<div id="InputBody">
<div class="box">
    <span id="StartDate">
        <input type="text" id="control1">
    </span>
    <span id="Result">
        <input type="text" id="control2">
    </span>
    <span id="SelectList">
        <select>
            <option value="1">Option 1</option>
            <option value="2">Option 2</option>
            <option value="3">Option 3</option>
        </select>
    </span>
</div>
<div class="box">
    <span id="StartDate">
        <input type="text" id="control1">
    </span>
    <span id="Result">
        <input type="text" id="control2">
    </span>
    <span id="SelectList">
        <select>
            <option value="1">Option 1</option>
            <option value="2">Option 2</option>
            <option value="3">Option 3</option>
        </select>
    </span>
</div>

e então o script:

$('#InputBody')
    // find all div containers with class = "box"
    .find('.box')
    .each(function () {
        console.log("child: " + this.id);

        // find all spans within the div who have an id attribute set (represents controls we want to capture)
        $(this).find('span[id]')
        .each(function () {
            console.log("span: " + this.id);

            var ctrl = $(this).find(':input:visible:first');

            console.log(this.id + " = " + ctrl.val());
            console.log(this.id + " SelectedText = " + ctrl.find(':selected').text());

        });
amora
fonte

Respostas:

167

Você poderia fazer isso:

if( ctrl[0].nodeName.toLowerCase() === 'input' ) {
    // it was an input
}

ou isto, que é mais lento, mas mais curto e mais limpo:

if( ctrl.is('input') ) {
    // it was an input
}

Se quiser ser mais específico, você pode testar o tipo:

if( ctrl.is('input:text') ) {
    // it was an input
}
user113716
fonte
2
Eu tive que adicionar a sintaxe jquery $ (element) .is ('input') para fazê-lo funcionar, mas em geral está ótimo.
Observer
28

alternativamente, você pode recuperar propriedades DOM com .prop

aqui está o código de amostra para a caixa de seleção

if( ctrl.prop('type') == 'select-one' ) { // for single select }

if( ctrl.prop('type') == 'select-multiple' ) { // for multi select }

para caixa de texto

  if( ctrl.prop('type') == 'text' ) { // for text box }
Rohit
fonte
Isso funciona perfeitamente com a nova função prop () do jQuery. Obrigado.
Thomas.Benz
7

Se você quiser apenas verificar o tipo, você pode usar a função .is () do jQuery,

Como no meu caso, usei abaixo,

if($("#id").is("select")) {
 alert('Select'); 
else if($("#id").is("input")) {
 alert("input");
}
Umesh Patil
fonte