Selon les spécifications HTML, la select
balise HTML n'a pas d' readonly
attribut, seulement un disabled
attribut. Donc, si vous voulez empêcher l'utilisateur de modifier la liste déroulante, vous devez utiliser disabled
.
Le seul problème est que les entrées de formulaire HTML désactivées ne sont pas incluses dans les données POST / GET.
Quelle est la meilleure façon d'émuler l' readonly
attribut d'une select
balise et d'obtenir toujours les données POST?
javascript
html
Jrgns
la source
la source
Réponses:
Vous devez conserver l'
select
élémentdisabled
mais également en ajouter un autre cachéinput
avec le même nom et la même valeur.Si vous réactivez votre SELECT, vous devez copier sa valeur dans l'entrée masquée dans un événement onchange et désactiver (ou supprimer) l'entrée masquée.
Voici une démo:
la source
selected
valeur est publiée et non la liste entière. Ainsi, votrehidden
siège devant votreselect
et détient la valeur sélectionnée. Si la sélection est désactivée pour "lecture seule", la publication ne contiendra que la valeur de l'entrée masquée. Si la sélection est activée, l'option sélectionnée visible "écrasera / remplacera" la valeur cachée, et c'est la valeur qui sera publiée en retour.On pourrait aussi utiliser ça
Désactivez tout sauf l'option sélectionnée:
De cette façon, la liste déroulante fonctionne toujours (et soumet sa valeur) mais l'utilisateur ne peut pas sélectionner une autre valeur.
Démo
la source
option
balisedisabled
$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Vous pouvez réactiver l'objet sélectionné lors de la soumission.
EDIT : c'est-à-dire, désactivant normalement la balise de sélection (avec l'attribut désactivé), puis la réactivant automatiquement juste avant de soumettre le formulaire:
Exemple avec jQuery:
Pour le désactiver:
Pour le réactiver avant la soumission afin que les données GET / POST soient incluses:
De plus, vous pouvez réactiver chaque entrée désactivée ou sélectionner:
la source
une autre façon de faire un
readOnly
attribut à unselect
élément consiste à utilisercss
vous pourriez faire comme:
DEMO
la source
... .on('mouseover', function(){ ... });
pointer-events: none
empêche la mise au point du curseur de la souris. Pour également empêcher la mise au point du clavier, vous pouvez la compléter en floutant immédiatement tous les événements de mise au point:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Testé et fonctionne sous IE 6, 7 et 8b2, Firefox 2 et 3, Opera 9.62, Safari 3.2.1 pour Windows et Google Chrome.
la source
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
au lieu de simplement changer l'index sélectionné en silence ..not-allowed
et la couleur d'arrière-plan sur#CCC
.Solution jQuery simple
Utilisez-le si vos sélections ont la
readonly
classeOu ceci si vos sélections ont l'
readonly="readonly"
attributla source
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
fonctionne très bien sur une seule sélection. Aucune classe "en lecture seule" n'est requise. La sélection multiple est problématique en ce sens que s'il y a plus d'une option déjà sélectionnée et donc non désactivée et qu'un utilisateur sélectionne l'une des options non désactivées, les autres options précédemment sélectionnées deviennent non sélectionnées.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
que vous ajoutiez simplement l'attribut readonly à l'élément - de cette façon, vous n'avez pas à traiter les sélections différemment de tout autre type. Le javascript améliore ensuite progressivement l'effet. Gardez à l'esprit que cette solution (et la plupart des autres) n'aide que l'agent utilisateur à fournir la meilleure expérience utilisateur - elle n'applique rien (cela doit être fait côté serveur si nécessaire).Solution CSS simple:
Cela se traduit par Sélectionner pour être gris avec un joli curseur "désactiver" au survol
et sur sélectionner la liste des options est "vide" afin que vous ne puissiez pas changer sa valeur.
la source
Encore une autre option plus contemporaine (sans jeu de mots) consiste à désactiver toutes les options de l'élément de sélection autre que l'élément sélectionné.
notez cependant qu'il s'agit d'une fonctionnalité HTML 4.0 et que 6,7,8 beta 1 semblent ne pas respecter cela.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
la source
C'est la meilleure solution que j'ai trouvée:
Le code ci-dessus désactive toutes les autres options non sélectionnées tout en conservant l'option sélectionnée activée. Ce faisant, l'option sélectionnée sera intégrée dans les données post-back.
la source
Je sais qu'il est beaucoup trop tard, mais cela peut être fait avec du CSS simple:
Le style masque toutes les options et les groupes lorsque la sélection est en
readonly
état, de sorte que l'utilisateur ne peut pas modifier sa sélection.Aucun piratage JavaScript n'est nécessaire.
la source
Plus simple encore: ajoutez l'attribut style à votre balise de sélection :
la source
C'est la solution la plus simple et la meilleure. Vous définissez un attr readolny sur votre sélection, ou tout autre attr comme data-readonly, et procédez comme suit
la source
Définissez la sélection désactivée lorsque vous prévoyez qu'elle soit en lecture seule, puis supprimez l'attribut désactivé juste avant de soumettre le formulaire.
la source
En plus de désactiver les options qui ne devraient pas être sélectionnables, je voulais en fait les faire disparaître de la liste, mais toujours pouvoir les activer en cas de besoin:
Cela recherche tous les éléments de sélection avec un attribut en lecture seule, puis recherche toutes les options à l'intérieur des sélections qui ne sont pas sélectionnées, puis les masque et les désactive.
Il est important de séparer la requête jquery en 2 pour des raisons de performances, car jquery les lit de droite à gauche, le code:
trouvera d'abord toutes les options non sélectionnées dans le document, puis filtrera celles qui se trouvent à l'intérieur des sélections avec un attribut en lecture seule.
la source
.prop("disabled", true)
placeUne approche simple côté serveur consiste à supprimer toutes les options sauf celle que vous souhaitez sélectionner. Ainsi, dans Zend Framework 1.12, si $ element est un Zend_Form_Element_Select:
la source
Si vous désactivez un champ de formulaire, celui-ci ne sera pas envoyé lors de l'envoi du formulaire. Donc, si vous avez besoin d'un
readonly
qui fonctionne comme si vousdisabled
envoyiez des valeurs, procédez comme suit:Après toute modification des propriétés en lecture seule d'un élément.
la source
Solution avec tabindex. Fonctionne avec des entrées de sélection mais aussi de texte.
Utilisez simplement une classe .disabled.
CSS:
JS:
HTML:
Edit: Avec Internet Explorer, vous avez également besoin de ce JS:
la source
À la suite de la suggestion de Grant Wagners; voici un extrait jQuery qui le fait avec des fonctions de gestionnaire au lieu d'attributs onXXX directs:
la source
Je l'ai résolu avec jquery:
la source
Si vous utilisez jquery validate, vous pouvez faire ce qui suit ci-dessous, j'ai utilisé l'attribut désactivé sans problème:
la source
Ce que j'ai trouvé fonctionne très bien, avec du javascript simple (c'est-à-dire: aucune bibliothèque JQuery requise), c'est de changer le innerHTML de la
<select>
balise en la valeur restante unique souhaitée.Avant:
Exemple de Javascript:
Après:
De cette façon, aucun changement d'effet visuel, et cela POST / GET dans le
<FORM>
.la source
Plutôt que la sélection elle-même, vous pouvez désactiver toutes les options à l'exception de l'option actuellement sélectionnée. Cela donne l'apparence d'une liste déroulante de travail, mais seule l'option que vous souhaitez transmettre est une sélection valide.
la source
solution html:
celles en javascript:
ôter:
modifier: ajout de méthodes de suppression
la source
Supprimez simplement l'attribut désactivé avant d'envoyer le formulaire.
la source
disabled="disabled" ->
obtiendra votre valeur de la base de données et le montrera dans le formulaire.readonly="readonly" ->
vous pouvez modifier votre valeur dans selectbox, mais votre valeur n'a pas pu être enregistrée dans votre base de données.la source
Si la liste déroulante de sélection est en lecture seule depuis la naissance et n'a pas besoin de changer du tout, peut-être devriez-vous utiliser un autre contrôle à la place? Comme un simple
<div>
(plus un champ de formulaire caché) ou un<input type="text">
?Ajouté: Si le menu déroulant n'est pas en lecture seule tout le temps et que JavaScript est utilisé pour l'activer / le désactiver, alors c'est toujours une solution - il suffit de modifier le DOM à la volée.
la source
Ci-dessous a fonctionné pour moi:
la source
Je l'ai réussi en cachant la case de sélection et en montrant un
span
à sa place avec seulement une valeur informative. En cas de désactivation de la.readonly
classe, nous devons également supprimer les.toVanish
éléments et afficher.toShow
ceux-ci.la source
Dans IE, j'ai pu vaincre l'approche onfocus => onblur en double-cliquant. Mais se souvenir de la valeur puis la restaurer dans l'événement onchange semble gérer ce problème.
Vous pouvez faire de même sans propriétés expando en utilisant une variable javascript.
la source
Voici une tentative d'utiliser une fonction jQuery personnalisée pour obtenir la fonctionnalité (comme mentionné ici):
la source