it-swarm.com.ru

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

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

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

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

  • Вместо отключения select отключите все options и используйте CSS, чтобы выделить выбор серым, чтобы он выглядел как отключенный.
  • Добавьте обработчик событий щелчка к кнопке отправки, чтобы включить все отключенные раскрывающиеся меню перед отправкой формы.
170
Marquis Wang
<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 - после. Как всегда, тестирование является ключевым.

113
Jordan S. Jones

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

код JQuery:

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});
214
Tres

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

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

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

12
Jean Paul Rumeau

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

    jQuery(function() {

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

    });
6
chhalpha

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

$('#toSelect')find(':not(:selected)').attr('disabled','disabled');
6
trafalmadorian

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

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

То же решение, предложенное Tres без использования 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.

5
Marco Demaio

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

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

4
PPB

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

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

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

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

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

3
Alex PARISOT

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

2
Byron Whitlock

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

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

1
Josh Mc

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

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

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

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");
1
Doglas
<select id="example">
    <option value="">please select</option>
    <option value="0" >one</option>
    <option value="1">two</option>
</select>



if (condition){
    //you can't select
    $("#example").find("option").css("display","none");
}else{
   //you can select
   $("#example").find("option").css("display","block");
}
0
Thxopen