Verifique si las entradas están vacías usando jQuery


493

Tengo un formulario en el que me gustaría que se rellenen todos los campos. Si se hace clic en un campo y luego no se completa, me gustaría mostrar un fondo rojo.

Aquí está mi código:

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

Aplica la clase de advertencia independientemente del campo que se complete o no.

¿Qué estoy haciendo mal?


Respuestas:


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

Y no necesariamente necesita .lengtho ver si es >0porque una cadena vacía se evalúa como falsa de todos modos, pero si desea hacerlo con fines de legibilidad:

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

Si está seguro de que siempre funcionará en un elemento de campo de texto, puede usarlo this.value.

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

También debe tener en cuenta que $('input:text')toma varios elementos, especifica un contexto o usa la thispalabra clave si solo desea una referencia a un elemento solitario (siempre que haya un campo de texto en los descendientes / hijos del contexto).


2
Creo que funcionará mejor si cambia de: if (! $ (This) .val ()) a: if (! $ (This) .val () && $ (this) .val ()! = "" )
alfasin

2
$ (this) .val (). length <1
Tomas

3
YourObjNameSpace.yourJqueryInputElement.keyup (function (e) {if ($. Trim ($ (this) .val ())) {// el valor recortado es verdad} else {// el valor recortado es falsey}}
Frankie Loscavio

Valido la longitud de los campos con tanta frecuencia que pasé por alto por completo .val().lengthy en su lugar estaba usando .length()el elemento en sí.
Tass

Para mayor robustez, también agregaría .trim () al final
HQuser

155

Todos tienen la idea correcta, pero me gusta ser un poco más explícito y recortar los valores.

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

si no usa .length, entonces una entrada de '0' puede marcarse como incorrecta, y una entrada de 5 espacios podría marcarse como correcta sin $ .trim. La mejor de las suertes.


18
Absolutamente correcto. El recorte es necesario, especialmente cuando se usan editores WYSIWYG quisquillosos (como jWYSIWYG, por ejemplo).
Josh Smith

¿Puedo sugerir cambiar el valor a val ---> if (! $. Trim (this.val) .length) {// cadena de longitud cero DESPUÉS de un recorte $ (this) .parents ('p'). AddClass (' advertencia'); }
K. Kilian Lindberg

this.valEstaría undefinedallí. Tendría que serlo $(this).val(), pero no hay una ventaja de navegador cruzado para eso, así que lo dejé por brevedad / velocidad.
Alex Sexton

33

Hacerlo en el desenfoque es demasiado limitado. Se supone que hubo un enfoque en el campo del formulario, por lo que prefiero hacerlo al enviar y asignar a través de la entrada. Después de años de lidiar con sofisticados trucos de desenfoque, enfoque, etc., mantener las cosas más simples producirá más usabilidad donde sea importante.

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

TypeError no detectada: No se puede leer la propiedad 'longitud' de indefinido
Chuck D

@ChuckD Me estaba dando el mismo error y me di cuenta de que faltaba $en if (('input:text').val().length == 0) {él debería serif ($('input:text').val().length == 0) {
fWd82

16

puedes usar también ..

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

Si tiene dudas sobre los espacios, intente ...

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

9

como nadie menciono

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

me parece más jquery


3
Esto no funciona en jQuery 1.9+ ya que cambiaron el funcionamiento del filtro selector. Jsfiddle.net/6r3Rk
Wick

2
Sugiero $ (this) .not ('[value]'). AddClass ('warning') para 1.9 jsfiddle.net/znZ9e
Jamie Pate

1
Creo que solo prueba si el campo comenzó con un atributo de valor. No prueba el valor real del campo de formulario como lo necesitaría para la validación. jsfiddle.net/T89bS ... el campo sin un atributo de valor se abofetea con salmón, independientemente de si escribe algo en él.
Wick

5

El evento keyup detectará si el usuario también ha borrado la casilla (es decir, el retroceso aumenta el evento pero el retroceso no genera el evento de pulsación de tecla en IE)

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

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

4

Considere usar el complemento de validación jQuery en su lugar. Puede ser un poco exagerado para los campos obligatorios simples, pero es lo suficientemente maduro como para manejar casos extremos que aún no ha pensado (ni ninguno de nosotros lo haría hasta que nos topamos con ellos).

Puede etiquetar los campos obligatorios con una clase de "obligatorio", ejecutar un $ ('formulario'). Validar () en $ (documento) .ready () y eso es todo lo que se necesita.

Incluso está alojado en Microsoft CDN también, para una entrega rápida: http://www.asp.net/ajaxlibrary/CDN.ashx


3

El :emptypseudo-selector se usa para ver si un elemento no contiene hijos, debe verificar el valor:

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

3

Hay otra cosa en la que es posible que desee pensar, actualmente solo puede agregar la clase de advertencia si está vacía, ¿qué tal si elimina la clase nuevamente cuando el formulario ya no está vacío?

Me gusta esto:

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

Aquí hay un ejemplo usando keyup para la entrada seleccionada. También usa un recorte para asegurarse de que una secuencia de caracteres de espacio en blanco no desencadene una respuesta verdadera. Este es un ejemplo que puede usarse para comenzar un cuadro de búsqueda o algo relacionado con ese tipo de funcionalidad.

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');
  }
});

Compruebe si todos los campos están vacíos y agregue ON u OFF en Filter_button


1

Puedes probar algo como esto:

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

Aplicará .blur()evento solo a las entradas con valores vacíos.


Buena solución, pero tenga en cuenta que esto solo funciona si la entrada no está vacía en la llamada a la función y también solo si el valor se guarda en el atributo "valor" de la entrada.
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>// :)

Probablemente también necesite recortar el espacio en blanco.
Raptor

0

Con HTML 5 podemos usar una nueva función "requerida", simplemente agréguela a la etiqueta que desea que se requiera, como:

<input type='text' required>


2
Y todos los navegadores no admiten esto ... Debe agregar un cheque js Y un cheque del lado del
servidor

Título de la pregunta, "Compruebe si las entradas están vacías utilizando jQuery"
JoshYates1980

0

Gran colección de respuestas, me gustaría agregar que también puede hacerlo usando el :placeholder-shownselector CSS. Un poco más limpio para usar IMO, especialmente si ya está usando jQ y tiene marcadores de posición en sus entradas.

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

También puede utilizar los selectores :validy :invalidsi tiene entradas que son necesarias. Puede usar estos selectores si está usando el atributo requerido en una entrada.


0

Una solución limpia de solo CSS sería:

input[type="radio"]:read-only {
        pointer-events: none;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.