Как сделать выпадающий список только для чтения с помощью jquery?


93

Я использую следующую инструкцию, чтобы сделать ее доступной только для чтения, но она не работает.

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

Я не хочу отключать его, я хочу сделать его только для чтения.


4
В чем будет разница между раскрывающимся списком только для чтения и стандартным раскрывающимся списком?
Leo

1
возможный дубликат настройки
Blazemonger

Это действительно проблема с jQuery? Или, может быть, выпадающий список просто не работает с атрибутом readonly?
Ilia G

Канишка Панамалдения уже дал вам правильный ответ (должен сделать его ответом, а не комментарием).
qbantek

2
Раскрывающийся список не всегда доступен только для чтения. Только для чтения означает, что вы можете видеть его значение, но не можете его изменить.
Suncat2000,

Ответы:


185
$('#cf_1268591').attr("disabled", true); 

раскрывающийся список всегда доступен только для чтения. что вы можете сделать, так это отключить его

если вы работаете с формой, отключенные поля не отправляются, поэтому используйте скрытое поле для хранения отключенного раскрывающегося значения


28
Отключение раскрывающегося списка не выполняется. Я попробую ваше решение.
Карим Али

3
Одна из проблем с отключением выбора (раскрывающегося списка) заключается в том, что в некоторых браузерах (например, IE9) теряется фокус. Это может быть проблемой, если элемент select отключается во время обработки вызова ajax, например, когда позиция пользователя в форме теряется.
Крис

1
Спасибо за ваше предложение. Просто вопрос; как сохранить раскрывающееся значение в скрытом поле? У вас есть пример кода для этого?
kramer65

2
Другой «обходной путь» - включить эти поля до отправки формы. Или в моем случае, когда я отправил данные в формате JSON (включить, получить данные, снова отключить): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (ваша форма)); disabled.attr ('отключено', 'отключено');
KDT

4
Вы должны использовать prop()сейчас.
Alex

146

У меня была такая же проблема, я решил отключить все не выбранные параметры. С jQuery очень просто:

$('option:not(:selected)').attr('disabled', true);

Изменить => Если у вас есть несколько раскрывающихся списков на одной странице, отключите все невыбранные параметры в идентификаторе выбора, как показано ниже.

$('#select_field_id option:not(:selected)').attr('disabled', true);

27
Отличная идея! Чтобы использовать лучшие практики с текущими версиями jQuery, я бы использовал метод prop для установки значения disabled. ie$('option:not(:selected)').prop('disabled', true);
Крис О'Коннелл

Это очень остроумное решение!
Жак

1
ДА! отличная идея.
Эрик

1
Это должен быть ответ №1.
Erwan Clügairtz

23

Это то, что вы ищете:

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

Работает как шарм.


2
Отличный ответ, но будьте осторожны, это по-прежнему позволяет выбрать вкладку. Также нужно установитьtabindex="-1"
uesports135

Великий человек, мне это нужно, так как отключен, не сопоставлен с моделью, спасибо за ваш ответ.
sina_Islam

22

Попробуйте вот это .. не отключая выбранное значение ..

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

Меня устраивает..


1
В той же строке, что и ваш ответ, я удалил другие параметры $ ('# cf_1268591 option: not (: selected)'). Remove ();
Сет Винтерс,

13

Я бы отключил поле. Затем, когда форма будет отправлена, не отключите ее. На мой взгляд, это проще, чем иметь дело со скрытыми полями.

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

13

Установка элемента с disabledне будет отправлять данные, однако selectэлементы не имеют readonly.

Вы можете моделировать readonlyна selectиспользование CSS для укладки и JS для предотвращения изменения с вкладкой:

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

Затем используйте это как:

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'));
});

Результат:


2
Очень крутой подход, но пользователь все еще может использовать TAB на клавиатуре для выбора значения.
Рикардо Мартинс,

1
@RicardoMartins, спасибо, обновил ответ, чтобы предотвратить изменения с помощью TAB
Лукас Бустаманте,

8

Простой jquery для удаления невыбранных параметров.

$('#your_dropdown_id option:not(:selected)').remove();

Также мое решение. Лучше, чем делать их инвалидами.
Джанлука

6

Чтобы упростить задачу, вот плагин jQuery, который делает это без лишних хлопот: https://github.com/haggen/readonly


Отличный (крошечный) фрагмент кода, спасибо. Он отключает раскрывающиеся списки, поэтому их нельзя изменить, но все же позволяет отправлять их значения. Очень полезно.
Алекс Хопкинс

3

Эта строка делает выборку с readonlyатрибутом только для чтения:

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

2

Этот код сначала сохранит исходный выбор в каждом раскрывающемся списке. Затем, если пользователь изменит выбор, он вернет раскрывающийся список к исходному выбору.

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);
});

2

Самым простым вариантом для меня было сделать выбор только для чтения и добавить:

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

Никакой лишней логики писать не нужно. Нет скрытых входов или отключены, а затем снова включены при отправке формы.


1

Это старая статья, но я хочу предупредить людей, которые ее найдут. Будьте осторожны с отключенным атрибутом с элементом got по имени. Странно, но вроде не так уж и хорошо.

это не работает:

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

эта работа:

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

Да, я знаю, что мне лучше использовать prop, а не attr, но, по крайней мере, теперь prop не будет работать из-за старой версии jquery, и теперь я не могу его обновить, не спрашивайте, почему ... разница html добавляется только 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()" />

...

Я не обнаружил ошибок в скрипте, а в версии с именем ошибок в консоли не было. Но, конечно, это может быть моя ошибка в коде

Видно: Chrome 26 на Win 7 Pro

Простите за плохую грамматику.


1

Я обнаружил, что лучший способ сделать это - использовать CSS для удаления событий указателя и изменения прозрачности в раскрывающемся списке (попробуйте 0,5). Это дает пользователю впечатление, что он отключен как обычно, но все же отправляет данные.

Конечно, у этого есть некоторые проблемы с обратной совместимостью, но, на мой взгляд, это лучший вариант, чем обойти досадную проблему с отключенным / только для чтения.


Не могли бы вы подробнее рассказать о CSS, необходимом для этого?
Cocowalla

1

Вы также можете отключить его, и в тот момент, когда вы делаете вызов отправки, включите его. Думаю, это самый простой способ :)


1

Работает очень хорошо

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

Здесь я вижу варианты, но не могу их выбрать


0

Не существует раскрывающегося списка только для чтения. Что вы можете сделать, так это сбрасывать его до первого значения вручную после каждого изменения.

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

http://jsfiddle.net/4aHcD/


3
нехорошо, если выбранный в данный момент параметр не стоит первым в списке, как в этом примере: jsfiddle.net/4aHcD/19
Homer

@Homer, код предназначен для его сброса после любого изменения, и он работает в этом эффекте. Если по какой-то причине вы хотите, чтобы он запускался изначально вместо того, чтобы изменять начальное значение самостоятельно, вы всегда можете вызвать событие изменения в своем элементе после объявления события, используя $("select").change(), например, jsfiddle.net/4aHcD/20
Alex Turpin

2
при первой загрузке страницы, если выбран третий элемент и пользователь пытается изменить его на второй элемент, ваш код изменяет выбор на первый элемент. Я не думаю, что этого не должно быть. Вот пример того, что, я думаю, хотел OP, раскрывающееся меню, которое не изменит свое выбранное значение в зависимости от взаимодействия с пользователем: jsfiddle.net/4aHcD/22
Homer

То, что мне нужно, и то, что запрашивал OP, было способом сделать его доступным только для чтения. Это означает, что вы можете видеть выбранное значение или значения, но не можете их изменить. Это означает, что дисплей имитирует внешний вид редактируемого элемента управления без возможности его редактирования.
Suncat2000

0

Попробуйте сделать пустую строку при "нажатии клавиши вверх"

HTML это:

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

JQuery:

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

// делаем после нажатия клавиши с пустой строкой

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

0

Может ты можешь попробовать этот способ

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

Это устанавливает первое значение раскрывающегося списка по умолчанию, и оно кажется только для чтения



0

Вот небольшой вариант других ответов, в которых предлагается использовать disabled. Поскольку атрибут disabled может иметь любое значение и при этом отключаться, вы можете установить его в значение только для чтения, например disabled = "readonly". Это отключит элемент управления как обычно, а также позволит вам легко стилизовать его иначе, чем обычные отключенные элементы управления, с помощью CSS, например:

select[disabled=readonly] {
    .... styles you like for read-only
}

Если вы хотите, чтобы данные были включены в отправку, используйте скрытые поля или включите перед отправкой, как подробно описано в других ответах.


0

Как сказал @Kanishka, если мы отключим элемент формы, он не будет отправлен. Я создал отрывок для этой проблемы. Когда элемент выбора отключен, он создает скрытое поле ввода и сохраняет значение. Когда он включен, он удаляет созданные скрытые поля ввода.

Больше информации

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>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.