Как обеспечить отправку поля формы ‹select›, когда оно отключено?

У меня есть поле формы select, которое я хочу пометить как «только для чтения», поскольку пользователь не может изменить значение, но значение по-прежнему отправляется вместе с формой. Использование атрибута disabled предотвращает изменение значения пользователем, но не отправляет значение вместе с формой.

Атрибут readonly доступен только для полей input и textarea, но в основном это то, что мне нужно. Есть ли способ заставить это работать?

Я рассматриваю две возможности:

  • Вместо отключения select отключите все option и используйте CSS, чтобы выделить выделение серым, чтобы он выглядел так, как будто он отключен.
  • Добавьте обработчик события щелчка к кнопке отправки, чтобы он включал все отключенные раскрывающиеся меню перед отправкой формы.

person Marquis Wang    schedule 27.07.2009    source источник
comment
извините за то, что присоединился с опозданием, однако решения, предоставленные @ trafalmadorian, работают лучше всего. Он отключает все входы, которые не выбраны. Он также будет работать, если для него включено несколько параметров. $('#toSelect')find(':not(:selected)').prop('disabled',true);   -  person Abhishek Madhani    schedule 03.03.2014
comment
В качестве альтернативы вы можете оставить элемент управления отключенным в пользовательском интерфейсе, но получить значение в методе действия: public ActionResult InsertRecord (модель MyType) {if (model.MyProperty == null) {model.MyProperty = Request [MyProperty]; }}   -  person beastieboy    schedule 24.11.2014


Ответы (14)


<select disabled="disabled">
    ....
</select>
<input type="hidden" name="select_name" value="selected value" />

Где select_name - это имя, которое вы обычно даете <select>.

Другой вариант.

<select name="myselect" disabled="disabled">
    <option value="myselectedvalue" selected="selected">My Value</option>
    ....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />

Теперь, используя этот, я заметил, что в зависимости от того, какой веб-сервер вы используете, вам, возможно, придется ввести ввод hidden либо до, либо после <select>.

Если мне не изменяет память, то с IIS ставишь раньше, с Apache ставишь после. Как всегда, ключевым моментом является тестирование.

person Jordan S. Jones    schedule 27.07.2009
comment
это звучит как единственный жизнеспособный вариант. Если вы используете jQuery или javascript, вы можете попробовать добавить значение при отправке в обработчике отправки. - person Phillip Whelan; 29.03.2010
comment
Как это будет зависеть от веб-сервера ? Разве это не клиент, который отображает страницу с полем выбора, и, таким образом, в случае подобного конфликта она будет клиент, который решает, отправлять значение на сервер или нет? - person Ilari Kajaste; 22.07.2011
comment
Это зависит от того, как сервер обрабатывает несколько входов с одним и тем же именем. - person Jordan S. Jones; 22.07.2011
comment
Лучше не полагаться на конкретный тип сервера, поэтому я думаю, что первый подход более понятен и менее подвержен ошибкам. - person Luke; 14.12.2012
comment
$('#toSelect')find(':not(:selected)').prop('disabled',true);, как отметил @trafalmadorian - person Abhishek Madhani; 03.03.2014
comment
Этот ответ кажется неполным: он не упоминает о необходимости использовать javascript для копирования значения в скрытое поле. Или это не нужно? - person Tomas; 11.03.2014
comment
@Tomas Для этого не требуется javascript. - person Jordan S. Jones; 11.03.2014
comment
@Jordan: браузеры не отправляют значения отключенных полей на сервер, поэтому они пусты, когда вы пытаетесь обработать их на стороне сервера. Если у вас есть скрытое поле с желаемым значением, а видимые поля отключены, на сервер будет отправлено только скрытое поле. Следовательно, скрытое поле должно создаваться (через JS или серверный код) только тогда, когда видимые поля отключены и нет проблемы с приоритетом. - person Matt van Andel; 09.10.2015
comment
Это вариант, только если вам нужна форма, работающая без javascript. - person Andrew; 23.08.2017

Отключите поля, а затем включите их перед отправкой формы:

код jQuery:

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});
person Tres    schedule 28.07.2009
comment
Я остановился на нем, главным образом потому, что он наименее навязчивый. - person Jonathan; 16.01.2013
comment
Документы jQuery рекомендуют использовать .prop и .removeProp для 'checked', 'selected' и 'disabled' вместо .attr и .removeAttr http://api.jquery.com/prop/. - person Jim Bergman; 16.11.2013
comment
Это должен быть принятый ответ. Намного чище и наименее навязчиво. - person Joshua Dance; 21.05.2014
comment
Соответствующий фрагмент комментария @ JimBergman - Свойства обычно влияют на динамическое состояние элемента DOM без изменения сериализованного атрибута HTML. Примеры включают свойство value элементов ввода, свойство disabled для входов и кнопок или свойство checked для флажка. Метод .prop () следует использовать для отключения и проверки вместо метода .attr (). Для получения и установки значения следует использовать метод .val (). - из api.jquery.com/prop - person Joshua Dance; 21.05.2014
comment
Спасибо @JoshuaDance. Я обновил ответ, чтобы использовать prop() вместо removeAttr(). В документах говорится об использовании prop() для собственных свойств вместо removeProp(), поскольку removeProp() полностью удалит свойство. - person Tres; 08.09.2015
comment
Ты гений (Ы) - person TommyDo; 26.02.2016
comment
Это один из самых невероятных трюков, о которых я знаю. Прекрасно работает. Спасибо. - person W.M.; 16.04.2016
comment
Отличное решение. - person Countach; 03.08.2016
comment
Мне нравится это решение, но просто имейте в виду, что если пользователь затем использует кнопку браузера «Назад», чтобы вернуться к форме, элементы управления больше не будут отключены. - person Andy Beverley; 22.10.2016
comment
@jonathanconway - хорошее использование слова obtrusive. Дополнительные элементы действительно навязчивы. - person toddmo; 27.04.2017

Я искал решение для этого, и, поскольку я не нашел решения в этом потоке, я сделал свое.

// With jQuery
$('#selectbox').focus(function(e) {
    $(this).blur();
});

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

person Jean Paul Rumeau    schedule 14.09.2012
comment
Вау Отличное и простое решение. Спасибо .. +1 от меня :) - person Naeem Ul Wahhab; 24.02.2013
comment
Мне это очень нравится ... в зависимости от взаимодействия в моей форме элементы становятся включенными / отключенными назад-n-вперед ... как мне повторно включить «размытое» поле в этом сценарии? - person bkwdesign; 12.11.2013
comment
Из Google выглядит как $ ('# selectbox'). Off ('focus'); сделает трюк повторного включения - person bkwdesign; 12.11.2013
comment
работает для текстовых полей, не работает для полей выбора, плюс очень легко обойти, нажав и удерживая кнопку - person Andrew; 23.08.2017

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

$('#toSelect')find(':not(:selected)').prop('disabled',true);
person trafalmadorian    schedule 02.05.2013
comment
Спасибо, я нашел ваш самый простой с логической точки зрения. Однако attr должен быть изменен на prop, будет выглядеть примерно как $('#toSelect')find(':not(:selected)').prop('disabled',true); - person Abhishek Madhani; 03.03.2014

он не работает с селектором ввода: для полей выбора, используйте это:

    jQuery(function() {

    jQuery('form').bind('submit', function() {
        jQuery(this).find(':disabled').removeAttr('disabled');
    });

    });
person chhalpha    schedule 25.01.2013

То же решение, предложенное Тресом, без используя jQuery

<form onsubmit="document.getElementById('mysel').disabled = false;" action="..." method="GET">

   <select id="mysel" disabled="disabled">....</select>

   <input name="submit" id="submit" type="submit" value="SEND FORM">
</form>

Это может помочь кому-то понять больше, но, очевидно, менее гибко, чем jQuery.

person Marco Demaio    schedule 10.11.2011
comment
Но это нехорошо для нескольких селекторов. Может быть, мы можем использовать getElementsByTagName('select')? - person Lucky; 25.08.2016

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

<select class="sel big" id="form_code" name="code" readonly="readonly">
   <option value="user_played_game" selected="true">1 Game</option>
   <option value="coins" disabled="">2 Object</option>
   <option value="event" disabled="">3 Object</option>
   <option value="level" disabled="">4 Object</option>
   <option value="game" disabled="">5 Object</option>
</select>

// Disable selection for options
$('select option:not(:selected)').each(function(){
 $(this).attr('disabled', 'disabled');
});
person Aleks    schedule 11.12.2012

Самый простой способ, который я нашел, - это создать крошечную функцию javascript, привязанную к вашей форме:

function enablePath() {
    document.getElementById('select_name').disabled= "";
}

и вы вызываете это в своей форме здесь:

<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">

Или вы можете вызвать его в функции, которую вы используете для проверки своей формы :)

person Alex PARISOT    schedule 23.02.2012

Просто добавьте строку перед отправкой.

$ ("# XYZ"). RemoveAttr ("отключено");

person PPB    schedule 23.03.2013

Или используйте JavaScript, чтобы изменить имя выбора и отключить его. Таким образом, выбор все еще будет отправлен, но с использованием имени, которое вы не проверяете.

person Byron Whitlock    schedule 27.07.2009

Я создал быстрый (только для JQuery) плагин, который сохраняет значение в поле данных, когда ввод отключен. Это просто означает, что до тех пор, пока поле отключается программно через jquery с использованием .prop () или .attr () ... тогда доступ к значению с помощью .val (), .serialize () или .serializeArra () всегда будет возвращать значение, даже если отключено :)

Бесстыдный плагин: https://github.com/Jezternz/jq-disabled-inputs

person Josh Mc    schedule 08.06.2013

На основе решения Jordan я создал функцию, которая автоматически создает скрытый ввод с тем же именем и тем же значением выбора, который вы хотите сделать недействительным. Первый параметр может быть идентификатором или элементом jquery; второй - это необязательный логический параметр, где «истина» отключает, а «ложь» включает ввод. Если не указан, второй параметр переключает выбор между «включено» и «отключено».

function changeSelectUserManipulation(obj, disable){
    var $obj = ( typeof obj === 'string' )? $('#'+obj) : obj;
    disable = disable? !!disable : !$obj.is(':disabled');

    if(disable){
        $obj.prop('disabled', true)
            .after("<input type='hidden' id='select_user_manipulation_hidden_"+$obj.attr('id')+"' name='"+$obj.attr('name')+"' value='"+$obj.val()+"'>");
    }else{
        $obj.prop('disabled', false)
            .next("#select_user_manipulation_hidden_"+$obj.attr('id')).remove();
    }
}

changeSelectUserManipulation("select_id");
person Doglas    schedule 24.02.2015
comment
параметр 'obj' должен быть объектом jquery - person Doglas; 24.02.2015

Нашел работоспособное решение: удалить все элементы, кроме выбранного. Затем вы можете изменить стиль на тот, который также выглядит отключенным. Используя jQuery:

jQuery(function($) {
    $('form').submit(function(){
        $('select option:not(:selected)', this).remove();
    });
});
person Alftheo    schedule 24.12.2010

Другой вариант - использовать атрибут readonly.

<select readonly="readonly">
    ....
</select>

При использовании только для чтения значение по-прежнему отправляется, поле ввода неактивно, и пользователь не может его редактировать.

Редактировать:

Цитируется из http://www.w3.org/TR/html401/interact/forms.html#adef-readonly:

  • Элементы, доступные только для чтения, получают фокус, но не могут быть изменены пользователем.
  • Элементы, доступные только для чтения, включены в навигацию с вкладками.
  • Элементы только для чтения могут быть успешными.

Когда он говорит, что элемент может быть успешным, это означает, что он может быть отправлен, как указано здесь: http://www.w3.org/TR/html401/interact/forms.html#success-controls

person Phillip Whelan    schedule 16.10.2009
comment
Элемент управления НЕ отображается серым цветом, и пользователь МОЖЕТ его редактировать. Вы не смогли прочитать весь раздел, и я цитирую: Следующие элементы поддерживают атрибут только для чтения: INPUT и TEXTAREA. - person Carlos Rendon; 27.03.2010
comment
Я знаю, что это старый ответ, но он действительно работает. Я не знаю причину многих отрицательных голосов. - person Ze Luis; 12.02.2015