"Contrôle de formulaire non valide" uniquement dans Google Chrome


106

Le code ci-dessous fonctionne bien dans Safari mais dans Chrome et Firefox, le formulaire ne sera pas soumis. La console Chrome enregistre l'erreurAn invalid form control with name='' is not focusable . Des idées?

Notez que bien que les contrôles ci-dessous n'aient pas de noms, ils devraient avoir des noms au moment de la soumission, renseignés par le Javascript ci-dessous. Le formulaire fonctionne dans 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>

Seuls les contrôles réussis seront envoyés. Pour réussir, un contrôle doit avoir un nom. Il existe également d'autres exigences (voir lien).
RobG

Les boutons radio ont des noms. Tout le reste obtient un nom via le JavaScript.
MFB

Réponses:


247

Chrome souhaite se concentrer sur un contrôle requis mais toujours vide afin de pouvoir afficher le message «Veuillez remplir ce champ». Cependant, si le contrôle est masqué au moment où Chrome souhaite afficher le message, c'est-à-dire au moment de la soumission du formulaire, Chrome ne peut pas se concentrer sur le contrôle car il est masqué, le formulaire ne sera donc pas soumis.

Donc, pour contourner le problème, lorsqu'un contrôle est masqué par javascript, nous devons également supprimer l'attribut 'required' de ce contrôle.


9
Ah, ça craint. Cela a du sens même si je suppose que le navigateur ne peut pas deviner comment il veut que votre interface traite les messages d'erreur de validation si le champ est masqué (peut-être un formulaire à onglets ...).
Wesley Murch

12
Merci, cela fonctionne. C'est dommage que Chrome fasse cela, il devrait simplement sauter le champ.
472084

J'ai eu ce problème dans Chrome pour textarea lorsque la longueur du texte dans textarea était supérieure à 4100 lettres, pas de champs obligatoires cachés. Lorsque la longueur du texte est <4000, tout fonctionne, sinon dans la console, je peux voir ce message et je ne peux pas soumettre le formulaire
ikos23

Si le champ n'est pas obligatoire lorsqu'il est masqué, ne serait-il pas encore plus judicieux de le désactiver à la place? ( stackoverflow.com/a/22753533/421243 )
David Cook

3
Que faire si cette erreur se produit toujours sur Chrome mais que le champ n'est pas vide? Avez-vous une idée de la façon de résoudre ce problème?
Leah

12

Il affichera ce message si vous avez un code comme celui-ci:

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

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

la solution à ce problème dépendra du fonctionnement du site

par exemple, si vous ne souhaitez pas que le formulaire soit soumis à moins que ce champ ne soit obligatoire, vous devez désactiver le bouton d'envoi

donc le code js pour afficher le div doit également activer le bouton d'envoi

vous pouvez également masquer le bouton (devrait être désactivé et masqué car s'il est masqué mais pas désactivé, l'utilisateur peut soumettre le formulaire avec d'autres moyens comme appuyez sur enterdans n'importe quel autre champ, mais si le bouton est désactivé, cela ne se produira pas

si vous voulez que le formulaire soit soumis si le div est masqué, vous devez désactiver toute entrée requise à l'intérieur et activer les entrées pendant que vous affichez le div

si quelqu'un a besoin des codes pour le faire, vous devez me dire exactement ce dont vous avez besoin


Oui .Pouvez-vous s'il vous plaît dire une solution pour cela?
Rex Rex

@RexRex je modifie la réponse voir si cela vous aide ou me dire exactement de quoi vous avez besoin
Robert

@KaziMasumBillah je ne comprends pas, vous pouvez écrire un exemple en réponse s'il vous plaît
Robert

9

Si vous ne vous souciez pas de la validation HTML5 (peut-être que vous validez dans JS ou sur le serveur), vous pouvez essayer d'ajouter "novalidate" au formulaire ou aux éléments d'entrée.


1
les gens ne devraient jamais faire des choses comme ça, il devrait faire fonctionner son code js avec html5 pas seulement fermer html5 parce qu'il ne peut pas le gérer
Robert

Je ne suis pas d'accord. Vous avez juste besoin d'une bonne raison pour faire les choses différemment. Il existe encore de nombreuses bibliothèques de validation puissantes. La validation HTML5 est simple et rapide à mettre en place. Et surtout, il est bon de suivre les normes. Mais cela ne veut pas dire que c'est «la meilleure» solution. Ne jamais dire jamais. Cela dépend toujours. Bien que je sois d'accord pour dire que vous ne devriez "jamais" ignorer complètement la validation du client. ;-)

5

essayez d'utiliser les balises appropriées pour les contrôles HTML5 Comme pour Number (entiers)

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

pour décimales ou float

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

step = 'Any' Sans cela, vous ne pouvez pas soumettre votre formulaire en saisissant une valeur décimale ou flottante telle que 3,5 ou 4,6 dans le champ ci-dessus.

Essayez de corriger le modèle, tapez pour les contrôles HTML5 pour résoudre ce problème.


tu as résolu mon problème. Mais faites attention qui patternne semble pas universellement acceptable sur le type="number"terrain
João Pimentel Ferreira

4

J'obtenais cette erreur et j'ai déterminé qu'il s'agissait en fait d'un champ qui n'était pas masqué.

Dans ce cas, c'était un type="number"champ, qui est obligatoire. Lorsqu'aucune valeur n'a jamais été saisie dans ce champ, le message d'erreur s'affiche dans la console et le formulaire n'est pas soumis. Entrer une valeur, puis la supprimer signifie que l'erreur de validation est affichée comme prévu.

Je pense que c'est un bogue dans Chrome: ma solution de contournement pour l'instant était de proposer une valeur initiale / par défaut.


Bogue possible dans Chrome. Il m'est également arrivé. +1
gamliela

1

J'ai eu l'erreur:

Un contrôle de formulaire non valide avec le nom = 'telefono' n'est pas focalisable.

Cela se produisait parce que je n'utilisais pas correctement le champ requis, ce qui était activé et désactivé en cliquant sur un checkbok. La solution était de supprimer l' requiredattribut chaque fois que le checkbok n'était pas marqué et de le marquer comme requis lorsque la case était cochée.

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

1

Je dois faire quelque chose comme ça pour corriger le bogue, car j'en ai type="number"avec 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 je ne règle pas tous les champs de saisie masqués sur nullchrome, j'essaierai toujours de valider l'entrée.


1

Aucune validation ne fera le travail.

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

0

J'ai eu ce problème lorsque j'avais class = "hidden" dans les champs de saisie parce que j'utilisais des boutons au lieu de puces radio - et que je changeais l'état "actif" via JS ..

J'ai simplement ajouté un champ d'entrée radio supplémentaire faisant partie du même groupe où je voulais que le msg apparaisse:

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

les 2 autres balles actives sont invisibles, celle-ci ne l'est pas et cela déclenche le message de validation et aucune erreur de console - un peu de hack mais ce qui ne l'est pas ces jours-ci ..



0

J'ai reçu ce message d'erreur lorsque j'ai entré un nombre (999999) qui était hors de la plage que j'avais définie pour le formulaire.

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

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

n'a pas fonctionné pour moi jusqu'à ce que j'aie mis tout mon code jQuery entre cela:

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

-5

remplacer requiredpar requis = "requis"


2
Required est un attribut HTML5 et et "required" a la même signification avec required = 'required' car il n'a aucun autre attribut disponible.
ilter
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.