Formulaire HTML readonly balises SELECT/input
Selon les spécifications HTML, le select
balise HTML ne dispose pas d'un readonly
attribut, seulement un disabled
attribut. Donc, si vous voulez garder l'utilisateur de modifier la liste déroulante, vous devez utiliser disabled
.
Le seul problème est que les personnes handicapées HTML entrées de formulaire ne sont pas inclus dans les POSTES /les données.
Quelle est la meilleure façon d'imiter les readonly
attribut pour un select
tag, et encore obtenir les données POST?
- Ne comptez pas sur que pour le côté serveur. N'importe qui peut créer sa propre page HTML et de le rendre RW.
- Donc, beaucoup de solutions, mais aussi de répondre à votre question, mais aucun d'entre eux est en train de dire que vous pouvez le faire avec un simple isset dans votre code php. Votre code ne s'encombre si vous utilisez des solutions de contournement.
- Mais ce n'est pas un PHP-question spécifique.
- Je vois que vous avez fait votre recherche concernant readonly vs désactivé formulaire HTML input mais ici, c'est utile pour ceux qui n'ont pas stackoverflow.com/questions/7730695/...
- Je suggère de ne pas utiliser un élément select à tous dans ce cas. Est-il une raison vous ne pouvez pas afficher la valeur en texte brut?
- votre commentaire n'a aucun sens. Je ne dis pas qu'il n'est jamais bon de cas d'utilisation pour les sélectionner ou les champs de formulaire masqué. L'OP avait de la difficulté à afficher du texte sur la page, et je me demandais simplement quel est le but était d'utiliser un élément select dans ce cas.
- Je dois être la lecture de la mauvaise question. Il dit qu'il veut désactiver le sélectionner afin que l'utilisateur n'a pas le changer. Peut-être qu'il doit rendre la page avec les choisir et les utiliser jquery pour empêcher le changement. Mais quand il la soumet, il n'est pas données. J'ai fait la même. J'ai besoin d'afficher sélectionne que est filtrée par d'autres sélectionne et le dernier enregistre dans la base de données via ajax et tous les précédents doit être verrouillé. Quand j'ai re le rendu de la page, oui, OK - je pourrais afficher des étiquettes au lieu de sélectionne. Mais ce n'est pas le problème 🙂
- Pour ce cas, vous ajoutez un antiforgery jeton à la forme que vous soumettez ensuite. Sur serverside le jeton est évaluée.
- stackoverflow.com/a/23428851/2557900 Ce doit être la accepté de répondre à cette question
- Non, il ne devrait pas être. C'est janky AF.
Vous devez vous connecter pour publier un commentaire.
Vous devriez garder la
select
élémentdisabled
mais aussi ajouter un autre cachéinput
avec le même nom et la valeur.Si vous réactivez votre SÉLECTIONNEZ, vous devez copier sa valeur à l'caché dans un événement onchange et de désactiver (ou supprimer) le caché d'entrée.
Voici une démo:
JS:
CSS:
HTML:
selected
valeur est comptabilisée pas l'ensemble de la liste. Donc, votrehidden
est assis devant votreselect
et titulaire de la valeur sélectionnée. Si ces options sont désactivées pour "readonly", le message de retour ne contient que la valeur de l'caché d'entrée. Si la sélection est activée, le visible sélectionnée option "écriture/remplacer" la valeur cachée, et c'est la valeur qui sera affichée en arrière.On peut aussi utiliser cette
Désactiver tous à l'exception de 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 choisir une autre valeur.
Démo
option
de la balisedisabled
attribut$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Vous pouvez ré-activer l'objet select sur "soumettre".
MODIFIER: c'est à dire, normalement, la désactivation de la balise select (avec les personnes handicapées de l'attribut), puis de le réactiver automatiquement juste avant l'envoi du formulaire:
Exemple avec jQuery:
Pour le désactiver:
Pour l'activer de nouveau avant la soumission de sorte que GET /POST données est inclus:
En outre, vous pouvez ré-activer tous les handicapés d'entrée ou sélectionnez:
une autre façon de faire un
readOnly
attribut à unselect
élément est par l'utilisation decss
vous pouviez faire comme :
DÉMO
... .on('mouseover', function(){ ... });
pointer-events: none
empêche de se concentrer à partir du curseur de la souris. Également empêcher le focus du clavier, vous pouvez le compléter en rendant immédiatement sur tous les événements de focus:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Testé et de travail dans IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 pour Windows et Google Chrome.
<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 la modification de l'index sélectionné en silence..not-allowed
et la couleur d'arrière-plan à#CCC
.JQuery Simple solution
Utilisez cette option si votre sélectionne ont la
readonly
classeOu si votre sélectionne ont la
readonly="readonly"
attribut$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
fonctionne très bien sur select unique. Pas de "readonly" la classe est nécessaire. La sélection Multiple est problématique du fait que si il n'y a plus d'une option déjà retenue et donc pas désactivé et qu'un utilisateur sélectionne l'un de la pas désactivé les options, les autres précédemment sélectionné, les options ne sont plus sélectionnées.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
de sorte qu'il suffit d'ajouter l'attribut lecture seule à l'élément de cette façon, vous n'avez pas à traiter sélectionne différemment de tout autre type. Le javascript puis progressivement augmente l'effet. Gardez à l'esprit que cette solution (et la plupart des autres) n'aide que l'agent utilisateur de fournir la meilleure expérience utilisateur, il ne fait pas appliquer n'importe quoi (qui doit être fait côté serveur si nécessaire).readonly
.CSS Simple solution:
Il en résulte choisir d'être gris, avec de belles "désactiver" curseur sur le vol stationnaire
et sur sélectionner la liste des options est "vide" donc, vous ne pouvez pas modifier sa valeur.
Encore un autre plus contemporain option (no pun intended) est de désactiver toutes les options de l'élément select, puis d'autres de celle sélectionnée.
note cependant que c'est un HTML 4.0 feature
et ie 6,7,8 bêta 1 semblent pas respecter.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
C'est la meilleure solution que j'ai trouvé:
Le code ci-dessus désactive toutes les autres options qui ne sont pas sélectionnés, tout en gardant l'option sélectionnée est activée. Faire le choix de l'option rendra dans l'après-back de données.
Encore plus facile:
ajoutez l'attribut style à votre sélectionnez tag:
Je sais que c'est beaucoup trop tard, mais il peut être fait avec CSS simple:
Le style cache toutes les options et les groupes lorsque la sélection est en
readonly
de l'état, de sorte que l'utilisateur ne peut pas modifier sa sélection.Pas de JavaScript hacks nécessaire.
C'est la plus simple et la meilleure solution.
Vous allez définir un readolny attr sur votre sélection, ou n'importe quelle autre attr comme des données en lecture seule, et effectuez les opérations suivantes
Définir l'sélectionnez désactivé lorsque vous plan pour qu'il soit en lecture seule, puis retirez le désactivé attribut juste avant de soumettre le formulaire.
En plus de désactiver les options qui ne devraient pas être sélectionnables je voulais les faire disparaître de la liste, mais encore être en mesure de leur permettre, si j'en ai besoin pour plus tard:
Ce trouve toutes sélectionner les éléments d'un attribut lecture seule, puis trouve toutes les options à l'intérieur sélectionne ceux qui ne sont pas sélectionnés, puis il les cache et les désactive.
Il est important de séparer le jquery requête en 2 pour des raisons de performance, parce que jquery lit de droite à gauche, le code:
va d'abord trouver tous les non sélectionnés options dans le document, puis filtrer ceux qui sont à l'intérieur sélectionne avec un attribut lecture seule.
.prop("disabled", true)
au lieuUne simple approche côté serveur est d'enlever toutes les options à l'exception de celui que vous souhaitez être sélectionné. Ainsi, dans le Zend Framework 1.12, si $element est un Zend_Form_Element_Select:
Si vous désactivez un champ de formulaire, ce ne sera pas envoyer lorsque le formulaire est soumis.
Donc, si vous avez besoin d'un
readonly
qui fonctionne commedisabled
mais l'envoi de valeurs de ce faire :Après toute modification de la readonly propriétés d'un élément.
Solution avec tabindex. Fonctionne avec les sélectionner, mais également des saisies de texte.
Il suffit d'utiliser une .désactivé classe.
CSS:
JS:
HTML:
Edit: Avec Internet Explorer, vous devez également à ce JS:
La suite de Subvention Wagners suggestion, voici un bout de code jQuery, il le fait avec des fonctions de gestionnaire au lieu de direct onXXX attributs:
J'ai résolu avec jquery:
Si vous utilisez jquery valider, vous pouvez faire ce qui suit ci-dessous, j'ai utilisé le désactivé attribut sans problème:
Ce que j'ai trouvé fonctionne très bien, avec du javascript (c'est à dire: pas de bibliothèque JQuery requis), est de changer le innerHTML de la
<select>
tag souhaité à l'unique valeur restante.Avant:
Exemple De Code Javascript:
Après:
De cette manière, aucun visiual effet de changement, et ce sera POST/GET intérieur de la
<FORM>
.Plutôt que de les sélectionner lui-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, mais seulement l'option que vous souhaitez transmis est une sélection valide.
html solution:
javascript: les
à supprimer:
edit: ajout de méthodes de suppression
Simplement, supprimer les personnes handicapées de l'attribut avant de soumettre le formulaire.
disabled="disabled" ->
obtenez votre valeur à partir de la base de données dan l'afficher dans le formulaire.readonly="readonly" ->
vous pouvez modifier votre valeur dans selectbox, mais votre valeur ne peut pas enregistrer dans votre base de données.Si l'sélectionnez le menu déroulant est en lecture seule depuis sa naissance et n'a pas besoin de changer à tout, peut-être que vous devriez utiliser un autre contrôle à la place? Comme un simple
<div>
(plus cachés de champ de formulaire) ou un<input type="text">
?Ajouté: Si la liste déroulante est pas en lecture seule de tous les temps et de JavaScript est utilisé pour activer/désactiver, puis c'est encore une solution - il suffit de modifier le DOM à la volée.
Ci-dessous a fonctionné pour moi :
J'ai réussi en masquant la zone de sélection et montrant un
span
à sa place avec seulement valeur d'information. L'événement de désactivation de la.readonly
classe, nous avons besoin aussi de supprimer le.toVanish
éléments et de montrer la.toShow
ceux.Dans IE j'ai été en mesure de vaincre le onfocus=>onblur approche en double-cliquant.
Mais se souvenant de la valeur et de la restauration dans l'événement onchange semble gérer cette question.
Vous pouvez faire la même sans expando propriétés à l'aide d'une variable javascript.
Voici une tentative d'utiliser un custom fonction jQuery pour obtenir la fonctionnalité (comme indiqué ici):
sélectionner plusieurs ne répond pas presque aussi bien pour le code ci-dessus suggestions. Avec BEAUCOUP de sledgehammering et kludging, j'ai fini avec cela:
très simple. Premier magasin de la valeur dans la variable. Puis sur modifier l'événement réglez la valeur stockée la variable qui contient la valeur initiale de
J'ai un dont le nom est la cartographie. Alors mon code sera comme suit;
Si vous avez une balise select, qui doit être en lecture seule, vous devez, logiquement, de transformer la zone de sélection dans un seul champ texte.
Je dis logiquement parce que c'est comme:
"J'ai pour afficher une valeur à l'utilisateur"
Peu importe si la valeur provient d'une balise select, est encore une valeur unique et ne peut être modifié (readonly).
Donc, logiquement, vous utilisez une balise select uniquement lorsque vous insérez d'abord la valeur.
Puis, quand vous avez besoin d'afficher cette valeur, vous devez le mettre sur un "champ de texte-readonly".
Même pour une sélection multiple qui devient une liste de valeurs (la valeur sélectionnée) si readonly
- Je utiliser "texte" en raison de la readonly-tag n'a pas besoin d'un attribut "type".
Cheers
Je sais que cela ne va pas aider tout le monde (si vous êtes du côté client uniquement), mais aidera certains qui sont de la pile et avoir le contrôle de backend à l'avant.
Si un utilisateur n'a pas de privilège pour modifier un champ, j'ai seulement le retour de la sélection courante de la liste déroulante.
Ici est une partie de mon backend contrôleur:
Il suffit de faire une entrée/champ de texte et ajouter le 'readonly' attribut. Si la sélection est effectivement désactivé, vous ne pouvez pas modifier la valeur de toute façon, de sorte que vous n'avez pas besoin de la balise select, et vous pouvez simplement afficher "sélectionné" valeur en tant que readonly de saisie de texte. Pour la plupart de l'INTERFACE utilisateur, je pense que cela devrait suffire.
Dans une option que vous pouvez utiliser
disabled="disabled"
, au lieu de le sélectionner lui-mêmeEu le même problème et a trouvé très utile de la propriété de forme -
submitdisabledcontrols
.Jeu de True et désactivé les entrées sont maintenant
POST
.