93 votes

Comment éviter d'envoyer les champs de saisie qui sont cachés par display:none à un serveur?

Imaginez que vous avez un formulaire où vous faites basculer la visibilité de plusieurs champs. Et si le champ n'est pas affiché, vous ne voulez pas que sa valeur soit dans la requête.

Comment gérez-vous cette situation?

134voto

karim79 Points 178055

Le fait de définir un élément de formulaire sur disabled empêchera qu'il soit envoyé vers le serveur, par exemple :

En JavaScript, cela voudrait dire quelque chose comme ceci :

var inputs = document.getElementsByTagName('input');
for(var i = 0; i < inputs.length; i++) {
    if(inputs[i].style.display == 'none') {
        inputs[i].disabled = true;
    }
}
document.forms[0].submit();

En jQuery :

   $('form > input:hidden').attr("disabled",true);
   $('form').submit();

17 votes

Avec le sélecteur pseudo jQuery :input au lieu de input, vous pouvez également facilement désactiver tous les éléments select et textarea

8 votes

Dans jQuery >= 1.6, au lieu de attr("disabled", true) vous devriez utiliser prop("disabled", true) api.jquery.com/prop

2 votes

@dominicbri7 - À partir de jQuery 1.6, il est recommandé d'utiliser .prop() au lieu de .attr() pour obtenir ET définir à la fois les propriétés disabled et checked. Vérifier et/ou définir en utilisant .attr() pourrait dans certains cas donner des résultats indésirables. Veuillez lire la documentation jQuery avant de commenter sur ce à quoi yorch faisait référence.

13voto

Benedict Cohen Points 6997

Vous pourriez utiliser JavaScript pour définir l'attribut désactivé. L'événement de clic sur le bouton 'submit' est probablement le meilleur endroit pour le faire.

Cependant, je vous conseillerais de ne pas le faire du tout. Si possible, vous devriez filtrer votre requête sur le serveur. Cela sera plus fiable.

8voto

macio.Jun Points 1857

Si vous souhaitez désactiver tous les éléments ou certains éléments à l'intérieur d'un élément parent masqué, vous pouvez utiliser

$("div").filter(":hidden").children("input[type='text']").attr("disabled", "disabled");

Cet exemple http://jsfiddle.net/gKsTS/ désactive tous les champs de texte à l'intérieur d'une div cachée

0 votes

C'est une très bonne solution car elle itère à travers la div cachée et la désactive toutes. cela devrait obtenir plus de +1

3voto

jsalvata Points 1015

Une solution très simple (mais pas toujours la plus pratique) est de supprimer l'attribut "name" -- la norme exige que les navigateurs ne renvoient pas de valeurs sans nom, et tous les navigateurs que je connais respectent cette règle.

4 votes

Pas recommandable car si vous changez d'états via JavaScript, vous ne pouvez presque pas réinitialiser les entrées sans mettre en cache tous les attributs de nom. Il est beaucoup plus facile de basculer l'état désactivé.

1voto

JMP Points 4276

Je supprimerais soit la valeur de l'entrée, soit je détacherais l'objet de l'entrée du DOM pour qu'il n'existe pas et ne soit pas posté en premier lieu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X