"Control de formulario no válido" solo en Google Chrome


106

El siguiente código funciona bien en Safari, pero en Chrome y Firefox el formulario no se envía. La consola de Chrome registra el error An invalid form control with name='' is not focusable. ¿Algunas ideas?

Tenga en cuenta que, si bien los controles a continuación no tienen nombres, deberían tener nombres en el momento del envío, llenados por el Javascript a continuación. El formulario funciona en Safari.

<form method="POST" action="/add/bundle"> 
<p> 
    <input type="text" name="singular" placeholder="Singular Name" required> 
    <input type="text" name="plural" placeholder="Plural Name" required> 
</p> 
<h4>Asset Fields</h4> 
<div class="template-view" id="template_row" style="display:none"> 
    <input type="text" data-keyname="name" placeholder="Field Name" required> 
    <input type="text" data-keyname="hint" placeholder="Hint"> 
    <select data-keyname="fieldtype" required> 
        <option value="">Field Type...</option> 
        <option value="Email">Email</option> 
        <option value="Password">Password</option> 
        <option value="Text">Text</option> 
    </select>    
    <input type="checkbox" data-keyname="required" value="true"> Required
    <input type="checkbox" data-keyname="search" value="true"> Searchable
    <input type="checkbox" data-keyname="readonly" value="true"> ReadOnly
    <input type="checkbox" data-keyname="autocomplete" value="true"> AutoComplete
    <input type="radio" data-keyname="label" value="label" name="label"> Label
    <input type="radio" data-keyname="unique" value="unique" name="unique"> Unique
    <button class="add" type="button">+</button> 
    <button class="remove" type="button">-</button> 
</div> 

<div id="target_list"></div> 
    <p><input type="submit" name="form.submitted" value="Submit" autofocus></p> 
</form>

<script> 
function addDiv()
{
    var pCount = $('.template-view', '#target_list').length;
    var pClone = $('#template_row').clone();
    $('select, input, textarea', pClone).each(function(idx, el){
        $el = $(this);
        if ((el).type == 'radio'){
            $el.attr('value', pCount + '_' + $el.data('keyname'));
        }
        else {
            $el.attr('name', pCount + '_' + $el.data('keyname'));
        };
    });
    $('#target_list').append(pClone);
    pClone.show();
}

function removeDiv(elem){
    var pCount = $('.template-view', '#target_list').length;
    if (pCount != 1)
    {
        $(elem).closest('.template-view').remove();
    }
};

$('.add').live('click', function(){
    addDiv();
});

$('.remove').live('click', function(){
    removeDiv(this);
});

$(document).ready(addDiv);

</script>

Solo se enviarán controles exitosos . Para tener éxito, un control debe tener un nombre. También hay otros requisitos (ver enlace).
RobG

Los botones de radio tienen nombres. Todo lo demás recibe un nombre a través de JavaScript.
MFB

Respuestas:


247

Chrome quiere centrarse en un control que es obligatorio pero que aún está vacío para que pueda aparecer el mensaje "Complete este campo". Sin embargo, si el control está oculto en el momento en que Chrome quiere que aparezca el mensaje, es decir, en el momento de enviar el formulario, Chrome no puede enfocarse en el control porque está oculto, por lo tanto, el formulario no se enviará.

Entonces, para solucionar el problema, cuando un control está oculto por javascript, también debemos eliminar el atributo 'requerido' de ese control.


9
Ah, eso apesta. Aunque supongo que tiene sentido, el navegador no puede adivinar cómo quiere que su interfaz trate los mensajes de error de validación si el campo está oculto (tal vez un formulario con pestañas ...).
Wesley Murch

12
Gracias, esto funciona. Sin embargo, es una pena que Chrome haga esto, debería omitir el campo.
472084

Tuve este problema en Chrome para textarea cuando la longitud del texto en textarea era más de 4100 letras, sin campos obligatorios ocultos. Cuando la longitud del texto es <4000, todo funciona; de lo contrario, en la consola puedo ver ese mensaje y no puedo enviar el formulario
ikos23

Si el campo no es obligatorio cuando está oculto, ¿no tendría más sentido desactivarlo en su lugar? ( stackoverflow.com/a/22753533/421243 )
David Cook

3
¿Qué pasa si este error todavía ocurre en Chrome pero el campo no está vacío? ¿Tienes idea de cómo solucionar esto?
Leah

12

Mostrará ese mensaje si tiene un código como este:

<form>
  <div style="display: none;">
    <input name="test" type="text" required/>
  </div>

  <input type="submit"/>
</form>

La solución a este problema dependerá de cómo debería funcionar el sitio.

por ejemplo, si no desea que se envíe el formulario a menos que este campo sea obligatorio, debe desactivar el botón de envío

por lo que el código js para mostrar el div también debería habilitar el botón enviar

también puede ocultar el botón (debe estar deshabilitado y oculto porque si está oculto pero no deshabilitado, el usuario puede enviar el formulario con otras formas, como presionar enteren cualquier otro campo, pero si el botón está deshabilitado, esto no sucederá

si desea que el formulario se envíe si el div está oculto, debe deshabilitar cualquier entrada requerida dentro de él y habilitar las entradas mientras muestra el div

si alguien necesita los códigos para hacerlo, debe decirme exactamente lo que necesita


Sí ... ¿puede decirnos una solución para esto?
Rex Rex

@RexRex edito la respuesta a ver si esto te ayuda o dime qué es exactamente lo que necesitas
Robert

@KaziMasumBillah no entiendo, puedes escribir un ejemplo en la respuesta, por favor
Robert

9

Si no le importa la validación de HTML5 (tal vez esté validando en JS o en el servidor), podría intentar agregar "novalidate" al formulario o los elementos de entrada.


1
la gente nunca debería hacer cosas como esas, debería hacer que su código js funcione con html5, no solo cerrar html5 porque no puede manejarlo
Robert

No estoy de acuerdo Solo necesitas una buena razón para hacer las cosas de manera diferente. Todavía hay muchas bibliotecas de validación poderosas por ahí. La validación de HTML5 es fácil y rápida de configurar. Y sobre todo es bueno seguir los estándares. Pero eso no significa que sea "la mejor" solución. Nunca digas nunca. Depende siempre. Aunque estoy de acuerdo en que "nunca" debe omitir la validación del cliente por completo. ;-)

5

intente usar etiquetas adecuadas para controles HTML5 Como para Número (enteros)

<input type='number' min='0' pattern ='[0-9]*' step='1'/>

para decimales o flotante

 <input type='number' min='0' step='Any'/>

step = 'Any' Sin esto, no puede enviar su formulario ingresando un valor decimal o flotante como 3.5 o 4.6 en el campo anterior.

Intente arreglar el patrón, escriba los controles HTML5 para solucionar este problema.


resolviste mi problema. Pero preste atención que patternno parece ser universalmente aceptable en el type="number"campo
João Pimentel Ferreira

3

Recibí este error y determiné que en realidad estaba en un campo que no estaba oculto.

En este caso, era un type="number"campo, eso es obligatorio. Cuando no se ha ingresado ningún valor en este campo, el mensaje de error se muestra en la consola y el formulario no se envía. Ingresar un valor y luego eliminarlo significa que el error de validación se muestra como se esperaba.

Creo que esto es un error en Chrome: mi solución por ahora era llegar a un valor inicial / predeterminado.


Posible error en Chrome. También me pasó a mí. +1
gamliela

1

Tuve el error:

Un control de formulario no válido con nombre = 'telefono' no se puede enfocar.

Esto sucedía porque no estaba usando el campo requerido correctamente, que se habilitaba y deshabilitaba al hacer clic en un checkbok. La solución fue eliminar el requiredatributo siempre que el checkbok no estuviera marcado y marcarlo como requerido cuando se marcó la casilla de verificación.

var telefono = document.getElementById("telefono");  
telefono.removeAttribute("required");

1

Tengo que hacer algo como esto para corregir el error, ya que tengo algunos type="number"con min="0.00000001":

HTML:

<input type="number" min="0.00000001" step="0.00000001" name="price" value="[%price%]" />

JS:

$('input[type="submit"]').click(function(e) {
    //prevent chrome bug
    $("input:hidden").val(null);
});

Si no configuro todos los campos de entrada ocultos en nullChrome, intentaré validar la entrada.


1

Ninguna validación hará el trabajo.

<form action="whatever" method="post" novalidate>

0

Tuve este problema cuando tenía class = "hidden" en los campos de entrada porque estaba usando botones en lugar de balas de radio, y cambiando el estado "activo" a través de JS ..

Simplemente agregué un campo de entrada de radio adicional que forma parte del mismo grupo donde quería que apareciera el mensaje:

<input type="radio" id="thenorm" name="ppoption" value=""  required style="opacity:0"/>

las otras 2 viñetas activas son invisibles, esta no lo es y esto desencadena el mensaje de validación y no hay errores de consola; es un truco, pero lo que no es en estos días.



0

Recibí este mensaje de error cuando ingresé un número (999999) que estaba fuera del rango que había establecido para el formulario.

<input type="number" ng-model="clipInMovieModel" id="clipInMovie" min="1" max="10000">

-2
$("...").attr("required"); and $("...").removeAttr("required"); 

no funcionó para mí hasta que puse todo mi código jQuery entre eso:

$(document).ready(function() {
    //jQuery code goes here
});

-5

reemplazar requiredpor required = "required"


2
Requerido es un atributo HTML5 y "required" tiene el mismo significado que required = 'required' porque no tiene otros atributos disponibles.
ilter
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.