Est-ce vraiment un problème jQuery? Ou peut-être que la liste déroulante ne fonctionne tout simplement pas avec l'attribut en lecture seule?
Ilia G du
Kanishka Panamaldeniya vous a déjà donné la bonne réponse (devrait en faire une réponse au lieu d'un commentaire).
qbantek
2
La liste déroulante n'est pas toujours en lecture seule. En lecture seule, vous pouvez voir sa valeur mais ne pouvez pas la modifier.
Suncat2000
Réponses:
182
$('#cf_1268591').attr("disabled",true);
le menu déroulant est toujours en lecture seule. ce que vous pouvez faire est de le désactiver
si vous travaillez avec un formulaire, les champs désactivés ne sont pas soumis, utilisez donc un champ masqué pour stocker la valeur de liste déroulante désactivée
La désactivation d'un menu déroulant n'est pas soumise. J'essaierai votre solution.
Karim Ali
3
Un problème avec la désactivation d'une sélection (liste déroulante) est que le focus est perdu dans certains navigateurs (par exemple IE9). Cela peut être un problème si l'élément select est désactivé pendant qu'un appel ajax est traité, par exemple, lorsque la position de l'utilisateur dans le formulaire est perdue.
Chris
1
Merci pour votre suggestion. Juste une question cependant; comment stocker la valeur déroulante dans un champ masqué? Auriez-vous un exemple de code pour cela?
kramer65
2
Une autre «solution de contournement» consisterait à activer ces champs avant la soumission du formulaire. Ou dans mon cas où j'ai envoyé les données au format JSON (activer, récupérer des données, désactiver à nouveau): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (votre formulaire)); disabled.attr ('désactivé', 'désactivé');
KDT
4
Vous devriez utiliser prop()maintenant.
alex le
144
J'ai eu le même problème, ma solution était de désactiver toutes les options non sélectionnées. Très facile avec jQuery:
$('option:not(:selected)').attr('disabled',true);
Edit =>
Si vous avez plusieurs listes déroulantes sur la même page, désactivez toutes les options non sélectionnées sur select-ID comme ci-dessous.
Bonne idée! Pour utiliser les meilleures pratiques avec les versions actuelles de jQuery, j'utiliserais la méthode prop pour définir la valeur désactivée. ie$('option:not(:selected)').prop('disabled', true);
Chris O'Connell
C'est une solution très spirituelle!
Jacques
1
OUI! bonne idée.
Eric le
1
Cela devrait être la réponse n ° 1.
Erwan Clügairtz
22
Essayez celui-ci .. sans désactiver la valeur sélectionnée.
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ahref="#">Click here to enable readonly</a><select><option>Example 1</option><optionselected>Example 2</option><option>Example 3</option></select>
Approche très cool, mais l'utilisateur peut toujours utiliser TAB sur le clavier pour sélectionner une valeur.
Ricardo Martins
1
@RicardoMartins merci, a mis à jour la réponse pour empêcher le changement avec TAB
Lucas Bustamante
12
Je rendrais le champ désactivé. Ensuite, lorsque le formulaire est soumis, désactivez-le. À mon avis, c'est plus facile que d'avoir à gérer des champs cachés.
//disable the field
$("#myFieldID").prop("disabled",true);//right before the form submits, we re-enable the fields, to make them submit.
$("#myFormID").submit(function(event){
$("#myFieldID").prop("disabled",false);});
Excellent (petit) extrait de code, merci. Il désactive les listes déroulantes afin qu'elles ne puissent pas être modifiées, mais permet toujours de soumettre leurs valeurs. Très utile.
Alex Hopkins
3
Cette ligne effectue des sélections avec l' readonlyattribut en lecture seule:
Ce code stockera d'abord la sélection d'origine dans chaque liste déroulante. Ensuite, si l'utilisateur modifie la sélection, il réinitialisera la liste déroulante à sa sélection d'origine.
//store the original selection
$("select :selected").each(function(){
$(this).parent().data("default",this);});//change the selction back to the original
$("select").change(function(e){
$($(this).data("default")).prop("selected",true);});
C'est un vieil article, mais je veux avertir les gens qui le trouveront. Soyez prudent avec l'attribut désactivé avec l'élément obtenu par nom. Étrange mais cela ne semble pas trop travailler.
Oui, je sais que je devrais mieux utiliser prop et non attr, mais au moins maintenant, prop ne fonctionnera pas à cause de l'ancienne version de jquery, et maintenant je ne peux pas le mettre à jour, ne demandez pas pourquoi ... la différence html est seulement ajoutée id:. ..
Je n'ai trouvé aucune erreur dans le script, et dans la version avec nom, il n'y avait aucune erreur dans la console. Mais bien sûr, cela peut être mon erreur de code
J'ai trouvé qu'une meilleure façon de le faire est d'utiliser CSS pour supprimer les événements de pointeur et modifier l'opacité dans la liste déroulante (essayez 0.5). Cela donne l'impression à l'utilisateur qu'il est désactivé normalement, mais qu'il publie toujours des données.
Certes, cela pose quelques problèmes de compatibilité ascendante, mais c'est à mon avis une meilleure option que de contourner le problème ennuyeux de la désactivation / lecture seule.
Il n'existe pas de liste déroulante en lecture seule. Ce que vous pouvez faire est de le réinitialiser manuellement à la première valeur après chaque modification.
pas bon si l'option actuellement sélectionnée n'est pas la première de la liste comme dans cet exemple: jsfiddle.net/4aHcD/19
Homer
@Homer, le code est destiné à le réinitialiser après tout changement, et cela fonctionne dans cet effet. Si vous voulez qu'il s'exécute initialement au lieu de changer la valeur initiale vous-même pour une raison quelconque, vous pouvez toujours appeler l'événement de changement sur votre élément après avoir déclaré l'événement, en utilisant $("select").change(), comme ça, jsfiddle.net/4aHcD/20
Alex Turpin
2
lorsque la page est chargée pour la première fois, si le troisième élément est sélectionné et que l'utilisateur essaie de le remplacer par le deuxième élément, votre code modifie la sélection vers le premier élément. Je ne pense pas qu'il ne devrait pas faire ça. Voici un exemple de ce que je pense que l'OP voulait, une liste déroulante qui ne changera pas sa valeur sélectionnée en fonction de l'interaction de l'utilisateur: jsfiddle.net/4aHcD/22
Homer
Ce dont j'avais besoin et ce que l'OP demandait, c'était un moyen de le rendre en lecture seule. Cela signifie que vous pouvez voir la ou les valeurs sélectionnées, mais ne pouvez pas les modifier. Cela signifie que l'affichage imite l'apparence du contrôle modifiable sans pouvoir le modifier.
Suncat2000
0
Essayez de créer une chaîne vide lorsque vous appuyez sur la touche
Voici une légère variation sur les autres réponses qui suggèrent d'utiliser désactivé. Puisque l'attribut "disabled" peut en fait avoir n'importe quelle valeur et être toujours désactivé, vous pouvez le définir sur readonly, comme disabled = "readonly". Cela désactivera le contrôle comme d'habitude et vous permettra également de le styliser facilement différemment des contrôles désactivés normaux, avec des CSS comme:
select[disabled=readonly]{.... styles you like for read-only
}
Si vous voulez que les données soient incluses, soumettez, utilisez les champs masqués ou activez avant de soumettre, comme détaillé dans les autres réponses.
Comme l'a dit @Kanishka, si nous désactivons un élément de formulaire, il ne sera pas soumis. J'ai créé un extrait pour ce problème. Lorsque l'élément de sélection est désactivé, il crée un champ d'entrée masqué et stocke la valeur. Lorsqu'elle est activée, elle supprime les champs de saisie masqués créés.
jQuery(document).ready(function($){var $dropDown = $('#my-select'),
name = $dropDown.prop('name'),
$form = $dropDown.parent('form');
$dropDown.data('original-name', name);//store the name in the data attribute
$('#toggle').on('click',function(event){if($dropDown.is('.disabled')){//enable it
$form.find('input[type="hidden"][name='+ name +']').remove();// remove the hidden fields if any
$dropDown.removeClass('disabled')//remove disable class .prop({
name: name,
disabled:false});//restore the name and enable }else{//disable it var $hiddenInput = $('<input/>',{
type:'hidden',
name: name,
value: $dropDown.val()});
$form.append($hiddenInput);//append the hidden field with same name and value from the dropdown field
$dropDown.addClass('disabled')//disable class.prop({'name': name +"_1",
disabled:true});//change name and disbale }});});
Réponses:
le menu déroulant est toujours en lecture seule. ce que vous pouvez faire est de le désactiver
si vous travaillez avec un formulaire, les champs désactivés ne sont pas soumis, utilisez donc un champ masqué pour stocker la valeur de liste déroulante désactivée
la source
prop()
maintenant.J'ai eu le même problème, ma solution était de désactiver toutes les options non sélectionnées. Très facile avec jQuery:
Edit => Si vous avez plusieurs listes déroulantes sur la même page, désactivez toutes les options non sélectionnées sur select-ID comme ci-dessous.
la source
$('option:not(:selected)').prop('disabled', true);
Essayez celui-ci .. sans désactiver la valeur sélectionnée.
Ça marche pour moi..
la source
Voici ce que vous recherchez:
Fonctionne comme un charme.
la source
tabindex="-1"
La définition d'un élément avec
disabled
ne soumettra pas les données, mais lesselect
éléments n'en ont pasreadonly
.Vous pouvez simuler un
readonly
sur l'select
utilisation de CSS pour le style et JS pour empêcher le changement avec onglet:Ensuite, utilisez-le comme:
Résultat:
Afficher l'extrait de code
la source
Je rendrais le champ désactivé. Ensuite, lorsque le formulaire est soumis, désactivez-le. À mon avis, c'est plus facile que d'avoir à gérer des champs cachés.
la source
Jquery simple pour supprimer les options non sélectionnées.
la source
Pour simplifier les choses, voici un plugin jQuery qui fait cela sans tracas: https://github.com/haggen/readonly
la source
Cette ligne effectue des sélections avec l'
readonly
attribut en lecture seule:la source
Ce code stockera d'abord la sélection d'origine dans chaque liste déroulante. Ensuite, si l'utilisateur modifie la sélection, il réinitialisera la liste déroulante à sa sélection d'origine.
http://jsfiddle.net/4aHcD/22/
la source
L'option la plus simple pour moi était de sélectionner en lecture seule et d'ajouter:
Vous n'avez pas besoin d'écrire de logique supplémentaire. Aucune entrée masquée ou désactivée puis réactivée lors de l'envoi du formulaire.
la source
C'est un vieil article, mais je veux avertir les gens qui le trouveront. Soyez prudent avec l'attribut désactivé avec l'élément obtenu par nom. Étrange mais cela ne semble pas trop travailler.
cela ne fonctionne pas:
ce travail:
Oui, je sais que je devrais mieux utiliser prop et non attr, mais au moins maintenant, prop ne fonctionnera pas à cause de l'ancienne version de jquery, et maintenant je ne peux pas le mettre à jour, ne demandez pas pourquoi ... la différence html est seulement ajoutée id:. ..
...
Je n'ai trouvé aucune erreur dans le script, et dans la version avec nom, il n'y avait aucune erreur dans la console. Mais bien sûr, cela peut être mon erreur de code
Vu sur: Chrome 26 sur Win 7 Pro
Désolé pour la mauvaise grammaire.
la source
J'ai trouvé qu'une meilleure façon de le faire est d'utiliser CSS pour supprimer les événements de pointeur et modifier l'opacité dans la liste déroulante (essayez 0.5). Cela donne l'impression à l'utilisateur qu'il est désactivé normalement, mais qu'il publie toujours des données.
Certes, cela pose quelques problèmes de compatibilité ascendante, mais c'est à mon avis une meilleure option que de contourner le problème ennuyeux de la désactivation / lecture seule.
la source
Vous pouvez également le désactiver et au moment où vous effectuez l'appel de soumission, activez-le. Je pense que c'est le moyen le plus simple :)
la source
Ça marche très bien
Avec cela, je peux voir les options mais je ne peux pas les sélectionner
la source
Il n'existe pas de liste déroulante en lecture seule. Ce que vous pouvez faire est de le réinitialiser manuellement à la première valeur après chaque modification.
http://jsfiddle.net/4aHcD/
la source
$("select").change()
, comme ça, jsfiddle.net/4aHcD/20Essayez de créer une chaîne vide lorsque vous appuyez sur la touche
Le Html est:
Le Jquery est:
// faire après keyup avec une chaîne vide
la source
Peut-être que tu peux essayer de cette façon
Cela définit la première valeur de la liste déroulante comme valeur par défaut et cela semble en lecture seule
la source
html5 prenant en charge:
»
la source
Voici une légère variation sur les autres réponses qui suggèrent d'utiliser désactivé. Puisque l'attribut "disabled" peut en fait avoir n'importe quelle valeur et être toujours désactivé, vous pouvez le définir sur readonly, comme disabled = "readonly". Cela désactivera le contrôle comme d'habitude et vous permettra également de le styliser facilement différemment des contrôles désactivés normaux, avec des CSS comme:
Si vous voulez que les données soient incluses, soumettez, utilisez les champs masqués ou activez avant de soumettre, comme détaillé dans les autres réponses.
la source
Comme l'a dit @Kanishka, si nous désactivons un élément de formulaire, il ne sera pas soumis. J'ai créé un extrait pour ce problème. Lorsque l'élément de sélection est désactivé, il crée un champ d'entrée masqué et stocke la valeur. Lorsqu'elle est activée, elle supprime les champs de saisie masqués créés.
Plus d'informations
la source