Controlla se gli input sono vuoti usando jQuery


493

Ho un modulo in cui vorrei che tutti i campi fossero compilati. Se un campo viene cliccato e quindi non compilato, vorrei visualizzare uno sfondo rosso.

Ecco il mio codice:

$('#apply-form input').blur(function () {
  if ($('input:text').is(":empty")) {
    $(this).parents('p').addClass('warning');
  }
});

Applica la classe di avviso indipendentemente dal campo da compilare o meno.

Che cosa sto facendo di sbagliato?


Risposte:


764
$('#apply-form input').blur(function()
{
    if( !$(this).val() ) {
          $(this).parents('p').addClass('warning');
    }
});

E non è necessariamente necessario .lengtho vedere se è >0dal momento che una stringa vuota restituisce comunque un valore falso, ma se lo si desidera per motivi di leggibilità:

$('#apply-form input').blur(function()
{
    if( $(this).val().length === 0 ) {
        $(this).parents('p').addClass('warning');
    }
});

Se sei sicuro che funzionerà sempre su un elemento del campo di testo, allora puoi semplicemente usare this.value.

$('#apply-form input').blur(function()
{
      if( !this.value ) {
            $(this).parents('p').addClass('warning');
      }
});

Inoltre, dovresti prendere nota che $('input:text')prende più elementi, specifica un contesto o usa la thisparola chiave se vuoi solo un riferimento a un elemento solitario (a condizione che ci sia un campo di testo nei discendenti / figli del contesto).


2
Penso che funzionerà meglio se cambi da: if (! $ (This) .val ()) a: if (! $ (This) .val () && $ (this) .val ()! = "" )
— alfasin,

2
$ (questo) .val (). lunghezza <1
— Tomas

3
YourObjNameSpace.yourJqueryInputElement.keyup (function (e) {if ($. Trim ($ (this) .val ())) {// il valore ritagliato è vero} altrimenti {// il valore ritagliato è falso}}
— Frankie Loscavio

Convalido la lunghezza dei campi così raramente che ho completamente ignorato .val().lengthe invece ho usato .length()l'elemento stesso.
— Tass

Per maggiore robustezza, aggiungerei anche .trim () alla fine
— HQuser l'

155

Ognuno ha l'idea giusta, ma mi piace essere un po 'più esplicito e tagliare i valori.

$('#apply-form input').blur(function() {
     if(!$.trim(this.value).length) { // zero-length string AFTER a trim
            $(this).parents('p').addClass('warning');
     }
});

se non si utilizza .length, una voce di '0' può essere contrassegnata come non valida e una voce di 5 spazi potrebbe essere contrassegnata come ok senza $ .trim. Buona fortuna.


18
Assolutamente giusto. Il taglio è necessario, specialmente quando si utilizzano editor WYSIWYG delicati (come jWYSIWYG, ad esempio).
— Josh Smith,

Posso suggerire di cambiare il valore in val ---> if (! $. Trim (this.val) .length) {// stringa di lunghezza zero DOPO un trim $ (questo) .parents ('p'). AddClass (' avvertimento'); }
— K. Kilian Lindberg,

this.valsarebbe undefinedlì. Dovrebbe esserlo $(this).val(), ma non c'è alcun vantaggio tra i browser, quindi l'ho lasciato fuori per brevità / velocità.
— Alex Sexton,

33

Farlo su sfocatura è troppo limitato. Presuppone che ci fosse un focus sul campo del modulo, quindi preferisco farlo su submit e mappare l'input. Dopo anni passati a gestire trucchi fantasiosi di sfocatura, messa a fuoco, ecc., Mantenere le cose più semplici produrrà più usabilità dove conta.

$('#signupform').submit(function() {
    var errors = 0;
    $("#signupform :input").map(function(){
         if( !$(this).val() ) {
              $(this).parents('td').addClass('warning');
              errors++;
        } else if ($(this).val()) {
              $(this).parents('td').removeClass('warning');
        }   
    });
    if(errors > 0){
        $('#errorwarn').text("All fields are required");
        return false;
    }
    // do the ajax..    
});

20
if ($('input:text').val().length == 0) {
      $(this).parents('p').addClass('warning');
}

Uncaught TypeError: impossibile leggere la proprietà 'length' di undefined
— Chuck D

@ChuckD mi è stato sempre lo stesso errore e ho capito che mi mancava $in if (('input:text').val().length == 0) {dovrebbe essereif ($('input:text').val().length == 0) {
— fWd82

16

puoi usare anche ..

$('#apply-form input').blur(function()
{
    if( $(this).val() == '' ) {
          $(this).parents('p').addClass('warning');
    }
});

se hai dubbi sugli spazi, prova ..

$('#apply-form input').blur(function()
{
    if( $(this).val().trim() == '' ) {
          $(this).parents('p').addClass('warning');
    }
});

9

come mai nessuno ha menzionato

$(this).filter('[value=]').addClass('warning');

mi sembra più jquery


3
Questo non funziona in jQuery 1.9+ poiché hanno cambiato il funzionamento del filtro selettore. Jsfiddle.net/6r3Rk
— Wick

2
Suggerisco $ (questo) .not ('[valore]'). AddClass ('warning') per 1.9 jsfiddle.net/znZ9e
— Jamie Pate

1
Credo che verifica solo se il campo è iniziato con un attributo value. Non verifica il valore del campo modulo effettivo come se fosse necessario per la convalida. jsfiddle.net/T89bS ... il campo senza un attributo value viene schiaffeggiato con il salmone a prescindere se si digita qualcosa al suo interno.
— Wick,

5

L'evento keyup rileverà se l'utente ha cancellato anche la casella (ovvero backspace genera l'evento ma backspace non genera l'evento keypress in IE)

    $("#inputname").keyup(function() {

if (!this.value) {
    alert('The box is empty');
}});

4

Prendi invece in considerazione l'utilizzo del plug-in di convalida jQuery . Può essere leggermente eccessivo per i campi obbligatori semplici, ma abbastanza maturo da gestire casi limite che non hai ancora pensato (e nessuno di noi fino a quando non ci incontreremo).

Puoi taggare i campi richiesti con una classe di "richiesto", eseguire $ ('form'). Validate () in $ (documento) .ready () e basta.

È persino ospitato su Microsoft CDN, per una consegna rapida: http://www.asp.net/ajaxlibrary/CDN.ashx


3

Lo :emptypseudo-selettore viene utilizzato per vedere se un elemento non contiene elementi secondari, è necessario verificare il valore:

$('#apply-form input').blur(function() {
     if(!this.value) { // zero-length string
            $(this).parents('p').addClass('warning');
     }
});

3

C'è un'altra cosa a cui potresti pensare: attualmente può solo aggiungere la classe di avviso se è vuota, che ne dici di rimuovere di nuovo la classe quando il modulo non è più vuoto.

come questo:

$('#apply-form input').blur(function()
{
    if( !$(this).val() ) {
          $(this).parents('p').addClass('warning');
    } else if ($(this).val()) {
          $(this).parents('p').removeClass('warning');
    }
});

3

function checkForm() {
  return $('input[type=text]').filter(function () {
    return $(this).val().length === 0;
  }).length;
}


2

Ecco un esempio usando il keyup per l'input selezionato. Utilizza anche un trim per assicurarsi che una sequenza di soli caratteri di spazio bianco non attivi una risposta veritiera. Questo è un esempio che può essere utilizzato per iniziare una casella di ricerca o qualcosa correlato a quel tipo di funzionalità.

YourObjNameSpace.yourJqueryInputElement.keyup(function (e){
   if($.trim($(this).val())){
       // trimmed value is truthy meaning real characters are entered
    }else{
       // trimmed value is falsey meaning empty input excluding just whitespace characters
    }
}

2
$(function() {
  var fields = $('#search_form').serializeArray();
  is_blank = true;
  for (var i = 0; i < fields.length; i++) {
    // excluded fields
    if ((fields[i].name != "locale") && (fields[i].name != "utf8")) {
      if (fields[i].value) {
        is_blank = false;
      }
    }
  }
  if (is_blank) {
    $('#filters-button').append(': OFF');
  }
  else {
    $('#filters-button').append(': ON');
  }
});

Controlla se tutti i campi sono vuoti e aggiungi ON o OFF su Filter_button


1

Puoi provare qualcosa del genere:

$('#apply-form input[value!=""]').blur(function() {
    $(this).parents('p').addClass('warning');
});

Applicherà l' .blur()evento solo agli input con valori vuoti.


Buona soluzione, ma tieni presente che funziona solo se l'input non è vuoto al momento della chiamata della funzione e solo se il valore viene salvato nell'attributo "value" dell'ingresso.
— Fabian von Ellerts,

0
<script type="text/javascript">
$('input:text, input:password, textarea').blur(function()
    {
          var check = $(this).val();
          if(check == '')
          {
                $(this).parent().addClass('ym-error');
          }
          else
          {
                $(this).parent().removeClass('ym-error');  
          }
    });
 </script>// :)

Probabilmente dovrai tagliare anche gli spazi bianchi.
— Raptor,

0

Con HTML 5 possiamo usare una nuova funzione "obbligatoria" per aggiungerla al tag che si desidera sia richiesta come:

<input type='text' required>


2
E tutti i browser non lo supportano ... Devi aggiungere un controllo js E un controllo sul lato
— server

Titolo della domanda, "Controlla se gli input sono vuoti usando jQuery"
— JoshYates1980,

0

Grande raccolta di risposte, vorrei aggiungere che puoi anche farlo utilizzando il :placeholder-shownselettore CSS. Un po 'più pulito per usare IMO, specialmente se stai già usando jQ e hai dei segnaposto nei tuoi input.

if ($('input#cust-descrip').is(':placeholder-shown')) {
  console.log('Empty');
}

$('input#cust-descrip').on('blur', '', function(ev) {
  if (!$('input#cust-descrip').is(':placeholder-shown')) {
    console.log('Has Text!');
  }
  else {
    console.log('Empty!');
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" class="form-control" id="cust-descrip" autocomplete="off" placeholder="Description">

È inoltre possibile utilizzare i selettori :valide :invalidse si dispone di input richiesti. È possibile utilizzare questi selettori se si utilizza l'attributo richiesto su un input.


0

Una soluzione pulita solo per CSS sarebbe:

input[type="radio"]:read-only {
        pointer-events: none;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.