"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>
MFB
fuente
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.

MFB
fuente
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

Robert
fuente
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.

Juan Velonis
fuente
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.

sudhAnsu63
fuente
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.

Matthew Schinckel
fuente
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");
frddy
fuente
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.

Dalin Huang
fuente
1

Ninguna validación hará el trabajo.

<form action="whatever" method="post" novalidate>
Hassi
fuente
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.

Fstarocka Burns
fuente
0

este error se obtiene si se agrega formato decimal. solo agrego

step="0.1"
Роман Зыков
fuente
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">
Thomas David Kehoe
fuente
-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
});
Fédi BELKACEM
fuente
-5

reemplazar requiredpor required = "required"

Webodrey
fuente
2
Requerido es un atributo HTML5 y "required" tiene el mismo significado que required = 'required' porque no tiene otros atributos disponibles.
ilter