Согласно спецификациям HTML, select
тег в HTML не имеет readonly
атрибута, только disabled
атрибут. Поэтому, если вы хотите, чтобы пользователь не мог изменить выпадающий список, вы должны использовать disabled
.
Единственная проблема заключается в том, что отключенные вводы HTML-форм не включаются в данные POST / GET.
Каков наилучший способ эмулировать readonly
атрибут для select
тега и при этом получать данные POST?
javascript
html
Jrgns
источник
источник
Ответы:
Вы должны сохранить
select
элемент,disabled
но также добавить еще один скрытыйinput
с тем же именем и значением.Если вы снова активируете свой SELECT, вы должны скопировать его значение в скрытый ввод в событии onchange и отключить (или удалить) скрытый ввод.
Вот демо:
источник
selected
отправляется только значение, а не весь список. Итак, вашhidden
сидит перед вашимselect
и держит выбранное значение. Если выбор отключен для «только для чтения», пост обратно будет содержать только значение скрытого ввода. Если выбор включен, видимый выбранный параметр будет «перезаписывать / заменять» скрытое значение, и это значение будет отправлено обратно.Мы могли бы также использовать это
Отключить все, кроме выбранной опции:
Таким образом, раскрывающийся список все еще работает (и отправляет свое значение), но пользователь не может выбрать другое значение.
демонстрация
источник
option
тегаdisabled
атрибута$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Вы можете повторно включить выбранный объект при отправке.
РЕДАКТИРОВАТЬ : т. Е. Обычно отключать тег select (с атрибутом disabled), а затем автоматически повторно включать его непосредственно перед отправкой формы:
Пример с jQuery:
Чтобы отключить это:
Чтобы повторно включить его перед отправкой, чтобы включить данные GET / POST:
Кроме того, вы можете повторно включить каждый отключенный вход или выбрать:
источник
другой способ сделать
readOnly
атрибут кselect
элемента с помощьюcss
Вы могли бы сделать как:
DEMO
источник
... .on('mouseover', function(){ ... });
pointer-events: none
предотвращает фокусировку от курсора мыши. Чтобы также предотвратить фокусировку с клавиатуры, вы можете дополнить ее, размывая сразу все события фокусировки:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Протестировано и работает в IE 6, 7 и 8b2, Firefox 2 и 3, Opera 9.62, Safari 3.2.1 для Windows и Google Chrome.
источник
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
этого, вместо того, чтобы просто поменять выбранный индекс молча ..not-allowed
и цвет фона на#CCC
.Простое решение jQuery
Используйте это, если ваш выбор имеет
readonly
классИли это, если ваш выбор имеет
readonly="readonly"
атрибутисточник
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
отлично работает на одном выборе. Класс «только для чтения» не требуется. Многократный выбор проблематичен тем, что, если уже выбрано несколько опций, и поэтому они не отключены, а пользователь выбирает одну из не отключенных опций, другие ранее выбранные опции становятся невыбранными.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
так, чтобы вы просто добавляли атрибут readonly к элементу - таким образом вам не нужно обрабатывать выборки иначе, чем любой другой тип. Javascript затем постепенно усиливает эффект. Имейте в виду, что это решение (и большинство других) только помогает пользовательскому агенту обеспечить наилучшее взаимодействие с пользователем - на самом деле оно ничего не применяет (это должно быть сделано на стороне сервера, если это необходимо).Простое решение CSS:
Это приводит к тому, что Select становится серым с красивым курсором «отключить» при наведении курсора,
а при выборе список параметров «пуст», поэтому вы не можете изменить его значение.
источник
Еще одна более современная опция (без каламбура) - отключить все опции элемента select, кроме выбранного.
заметьте, однако, что это особенность HTML 4.0 и, следовательно, 6,7,8 бета 1, кажется, не уважают это.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
источник
Это лучшее решение, которое я нашел:
Приведенный выше код отключает все остальные параметры, не выбранные, оставляя выбранный параметр включенным. При этом выбранная опция превратится в данные обратной передачи.
источник
Я знаю, что уже слишком поздно, но это можно сделать простым CSS:
Стиль скрывает все параметры и группы, когда выбран
readonly
состоянии, поэтому пользователь не может изменить свой выбор.Нет необходимости в взломах JavaScript.
источник
Еще проще: добавьте атрибут стиля в ваш тег выбора :
источник
Это самое простое и лучшее решение. Вы установите readolny attr на свой выбор или любой другой attr, например data-readonly, и выполните следующее
источник
Установите флажок «отключить», если вы планируете сделать его доступным только для чтения, а затем удалите атрибут «отключен» непосредственно перед отправкой формы.
источник
В дополнение к отключению опций, которые не должны быть выбраны, я хотел, чтобы они фактически исчезли из списка, но все еще были в состоянии включить их, если мне потребуется позже:
Он находит все элементы выбора с атрибутом «только для чтения», затем находит все параметры внутри тех элементов выбора, которые не были выбраны, затем скрывает их и отключает их.
Важно разделить запрос jquery на 2 по соображениям производительности, потому что jquery читает их справа налево, код:
сначала найдет все невыбранные параметры в документе, а затем отфильтрует те, которые находятся внутри выделенных элементов, с атрибутом только для чтения.
источник
.prop("disabled", true)
вместо этогоОдин простой подход на стороне сервера - удалить все опции, кроме той, которую вы хотите выбрать. Таким образом, в Zend Framework 1.12, если $ element является Zend_Form_Element_Select:
источник
Если вы отключите поле формы, оно не будет отправлено при отправке формы. Так что если вам нужно, чтобы
readonly
это работало как,disabled
но отправка значений сделайте это:После любого изменения только для чтения свойств элемента.
источник
Решение с помощью tabindex. Работает с выбранными, но и текстовыми вводами.
Просто используйте класс .disabled.
CSS:
JS:
HTML:
Изменить: С Internet Explorer вам также нужен этот JS:
источник
Вслед за предложением Гранта Вагнера; Вот фрагмент кода jQuery, который делает это с помощью функций-обработчиков вместо прямых атрибутов onXXX:
источник
Я решил это с помощью jquery:
источник
Если вы используете jquery validate, вы можете сделать следующее ниже, я использовал атрибут disabled без проблем:
источник
То, что я нашел, работает отлично, с простым javascript (то есть: библиотека JQuery не требуется), это изменить innerHTML
<select>
тега на желаемое единственное оставшееся значение.Перед:
Образец Javascript:
После:
Таким образом, визуальный эффект не изменится, и это будет POST / GET в пределах
<FORM>
.источник
Вместо самого выбора можно отключить все параметры, кроме выбранного в данный момент. Это дает вид рабочего раскрывающегося списка, но только вариант, который вы хотите передать, является допустимым выбором.
источник
HTML-решение:
Javascript из них:
удалять:
редактировать: добавлены методы удаления
источник
Просто удалите атрибут disabled перед отправкой формы.
источник
disabled="disabled" ->
получит ваше значение из базы данных, покажет его в форме.readonly="readonly" ->
Вы можете изменить свое значение в selectbox, но ваше значение не может быть сохранено в вашей базе данных.источник
Если с момента рождения выпадающий список доступен только для чтения и не требует изменений, возможно, вам следует использовать другой элемент управления? Как простой
<div>
(плюс скрытое поле формы) или<input type="text">
?Добавлено: если раскрывающийся список не всегда доступен только для чтения, а JavaScript используется для его включения / отключения, то это все же решение - просто измените DOM на лету.
источник
Ниже работало для меня:
источник
Я справился с этим, скрыв поле выбора и показав
span
вместо него только информационное значение. В случае отключения.readonly
класса нам также нужно удалить.toVanish
элементы и показать.toShow
их.источник
В IE я смог победить подход onfocus => onblur двойным щелчком мыши. Но запоминание значения и последующее восстановление его в событии onchange, похоже, решают эту проблему.
Вы можете сделать подобное без свойств расширения, используя переменную javascript.
источник
Вот попытка использовать пользовательскую функцию jQuery для достижения функциональности (как упомянуто здесь):
источник