Comment créer une liste déroulante en lecture seule en utilisant jquery?

91

J'utilise la déclaration suivante pour le rendre en lecture seule mais cela ne fonctionne pas.

$('#cf_1268591').attr("readonly", "readonly"); 

Je ne veux pas le désactiver, je veux le rendre en lecture seule.

Karim Ali
la source
4
Quelle serait la différence entre une liste déroulante en lecture seule et une liste déroulante standard?
Leo
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

Kanishka Panamaldeniya
la source
26
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.

$('#select_field_id option:not(:selected)').attr('disabled', true);
Bertrand D.
la source
24
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.

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Ça marche pour moi..

Prabhagaran
la source
Dans le même sens que votre réponse, j'ai supprimé les autres options $ ('# cf_1268591 option: not (: selected)'). Remove ();
Seth Winters le
20

Voici ce que vous recherchez:

$('#cf_1268591').attr("style", "pointer-events: none;");

Fonctionne comme un charme.

mainak chakraborty
la source
1
Excellente réponse, mais attention, cela permet toujours de sélectionner un onglet. Vous devez également définir letabindex="-1"
uesports135
Great Man, j'ai besoin de cela, car désactivé non mappé sur le modèle merci pour votre réponse.
sina_Islam
13

La définition d'un élément avec disabledne soumettra pas les données, mais les selectéléments n'en ont pas readonly.

Vous pouvez simuler un readonlysur l' selectutilisation de CSS pour le style et JS pour empêcher le changement avec onglet:

select[readonly] {
  background: #eee;
  pointer-events: none;
  touch-action: none;
}

Ensuite, utilisez-le comme:

var readonly_select = $('select');
$(readonly_select).attr('readonly', true).attr('data-original-value', $(readonly_select).val()).on('change', function(i) {
    $(i.target).val($(this).attr('data-original-value'));
});

Résultat:

Lucas Bustamante
la source
2
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 );
});     
NL3294
la source
8

Jquery simple pour supprimer les options non sélectionnées.

$('#your_dropdown_id option:not(:selected)').remove();
abhi chavda
la source
Aussi ma solution. Mieux vaut les rendre handicapés.
Gianluca Demarinis
6

Pour simplifier les choses, voici un plugin jQuery qui fait cela sans tracas: https://github.com/haggen/readonly

Arthur Corenzan
la source
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:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);
admirhodzique
la source
2

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/

//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);
});
Homère
la source
2

L'option la plus simple pour moi était de sélectionner en lecture seule et d'ajouter:

onmousedown="return false" onkeydown="return false"

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.

Awais Tariq
la source
1

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:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('name=img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

ce travail:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('#img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

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:. ..

<select name="img_size" class="dropDown" id="img_size">
<option value="200">200px
</option><option value="300">300px
</option><option value="400">400px
</option><option value="500">500px
</option><option value="600" selected="">600px
</option><option value="800">800px
</option><option value="900">900px
</option><option value="1024">1024px
</option></select>

<input type="checkbox" name="fullpage" id="fullpage" onChange="onChangeFullpageCheckbox()" />

...

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.

Andrej
la source
1

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.

utilisateur3427526
la source
Pouvez-vous élaborer sur le CSS requis pour ce faire?
Cocowalla
1

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 :)

Hictus
la source
1

Ça marche très bien

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Avec cela, je peux voir les options mais je ne peux pas les sélectionner

Ricardo Mendes
la source
0

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.

$("select").change(function(event) {
    $(this).val($(this).find("option").first().val());
});

http://jsfiddle.net/4aHcD/

Alex Turpin
la source
3
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

Le Html est:

<input id="cf_1268591" style="width:60px;line-height:16px;border:1px solid #ccc">

Le Jquery est:

$("#cf_1268591").combobox({
  url:"your url",
  valueField:"id",
  textField:"text",
  panelWidth: "350",
  panelHeight: "200",
});

// faire après keyup avec une chaîne vide

var tb = $("#cf_1268591").combobox("textbox");
  tb.bind("keyup",function(e){
  this.value = "";
});
Hendro
la source
0

Peut-être que tu peux essayer de cette façon

function myFunction()
{
   $("select[id^=myID]").attr("disabled", true);
   var txtSelect = $("select[id^=myID] option[selected]").text();
}

Cela définit la première valeur de la liste déroulante comme valeur par défaut et cela semble en lecture seule

Monicalh
la source
0

html5 prenant en charge:

`
     $("#cCity").attr("disabled", "disabled"); 
     $("#cCity").addClass('not-allow');

»

Atul Kumar
la source
0

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.

DaveInMaine
la source
0

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

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 
    }
  });
});
/*Optional*/

select.disabled {
  color: graytext;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form action="#" name="my-form">
  <select id="my-select" name="alpha">
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
  </select>
</form>
<br/>
<button id="toggle">toggle enable/disable</button>

Amiya
la source