Як забезпечити подання поля <вибору>, коли воно вимкнено?


180

У мене є selectполе форми, яке я хочу відзначити як "тільки для читання", оскільки в користувачеві не можна змінювати значення, але значення все одно подається разом із формою. Використання disabledатрибуту не дозволяє користувачеві змінювати значення, але не подає значення за допомогою форми.

readonlyАтрибут доступний тільки для inputі textareaполів, але це в основному те , що я хочу. Чи є якийсь спосіб налагодити це?

Дві можливості, які я розглядаю, включають:

  • Замість того, щоб вимкнути функцію select, вимкніть всі елементи options та використовуйте CSS, щоб виділити сірий вибір, щоб він виглядав як його відключений.
  • Додайте обробник подій клацання до кнопки надсилання, щоб він ввімкнув усі вимкнено меню, що випадає, перш ніж надсилати форму.

2
вибачте за те, що пізно приєдналися, проте рішення, які надає @ trafalmadorianWorkest, найкращі. Він вимикає всі входи, які не вибрані. Він також буде працювати, якщо в ньому вибрано кілька опцій. $('#toSelect')find(':not(:selected)').prop('disabled',true);
Абхішек Мадхані

Крім того, ви можете залишити елемент керування вимкненим у користувальницькому інтерфейсі, але отримати значення у методі дії: public ActionResult InsertRecord (модель MyType) {if (model.MyProperty == null) {model.MyProperty = Запит ["MyProperty"]; }}
beastieboy

Відповіді:


118
<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 ви ставите її після. Як завжди, тестування є ключовим.


3
Як це може залежати від веб- сервера? Чи не клієнт переносить сторінку з полем вибору, і, таким чином, у випадку подібних конфліктів, саме клієнт вирішує, надсилати значення на сервер чи ні?
Іларі Каясте

8
Це залежить від того, як сервер обробляє кілька входів з одним іменем.
Джордан С. Джонс

1
Вам краще не покладатися на певний тип сервера, тому я думаю, що перший підхід чистіший і менш схильний до помилок ..
Лука

5
@Jordan: Браузери не надсилають на сервер значення відключених полів, тому вони порожні, коли ви намагаєтеся обробити їх на стороні сервера. Якщо у вас є приховане поле з потрібним значенням, а видимі поля відключені, на сервер буде надіслано лише приховане поле. Ерго, приховане поле має бути створене (за допомогою JS або коду на стороні сервера) лише тоді, коли видимі поля вимкнено і немає пріоритетного питання.
Метт ван Андель

1
Це лише варіант, якщо вам потрібна форма, яка працює без JavaScript.
Андрій

224

Вимкніть поля, а потім увімкніть їх до надсилання форми:

Код jQuery:

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

15
Досить приємне рішення!
Кріс

2
Це той, на якому я влаштувався, головним чином тому, що це найменш нав'язливий.
Джонатан

3
Документи jQuery рекомендують використовувати .prop та .removeProp для "перевірених", "вибраних" та "відключених" замість .attr та .removeAttr див. http://api.jquery.com/prop/
Джим Бергман

2
Відповідний біт коментаря @ JimBergman - "Властивості, як правило, впливають на динамічний стан елемента DOM без зміни серіалізованого атрибута HTML. Приклади включають властивість значень елементів введення, вимкнено властивість входів та кнопок або встановлену прапорець. Метод .prop () слід використовувати для встановлення вимкнених і перевірених замість методу .attr (). Для отримання та встановлення значення слід використовувати метод .val (). " - від api.jquery.com/prop
Танець Джошуа

2
Ви геніальний один (Y)
TommyDo

13

Я шукав рішення для цього, і оскільки я не знайшов рішення в цій темі, я зробив своє.

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

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


Нічого чудове і просте рішення. Дякую .. +1 від мене :)
Naeem Ul Wahhab

Мені це дуже подобається .. залежно від взаємодії в моїй формі елементи стають увімкненими / відключеними назад-n-вперед ... як я знову вмикаю поле "розмито" в цьому сценарії?
bkwdesign

Від googling виглядає як $ ('# selectbox'). Off ('focus'); зробить трюк повторного включення
bkwdesign

2
працює для текстових полів, не працює для виділених полів, а також супер легко обійти, натиснувши та утримуючи кнопку
Ендрю

7

Я зіткнувся з дещо іншим сценарієм, у тому, що я хотів лише не дозволити користувачеві змінювати вибране значення на основі попереднього вибору. Що я в кінцевому підсумку робив, це просто вимкнути всі інші не вибрані параметри у вікні вибору за допомогою

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

Дякую, я знайшов вашу найбільш логічно найпростішою. Однак attrслід змінити prop, виглядало б щось на зразок$('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani

6

Це ж рішення, запропоноване 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.


Але, це не приємно для декількох селекторів. Може, ми можемо використовувати getElementsByTagName('select')?
Лаки

6

він не працює з селектором введення для вибраних полів, використовуйте це:

    jQuery(function() {

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

    });

5

Я використовую наступний код для відключення параметрів у виділеннях

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

4

Найпростіший спосіб, який я знайшов, - створити крихітну функцію JavaScript, прив’язану до вашої форми:

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

і ви називаєте це у своїй формі тут:

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

Або ви можете зателефонувати в функцію, яку ви використовуєте для перевірки форми :)


4

Просто додайте рядок перед надсиланням.

$ ("# XYZ"). RemoveAttr ("вимкнено");


2

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


2

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

Безсоромний штекер: https://github.com/Jezternz/jq-disabled-inputs


2

На основі рішення Йордану я створив функцію, яка автоматично створює прихований вхід з тим же ім'ям і тим самим значенням вибору, який ви хочете стати недійсним. Першим параметром може бути ідентифікатор або елемент 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");

Параметр 'obj' повинен бути об’єктом jquery
Doglas

1

Я знайшов ефективне рішення: видаліть усі елементи, крім вибраного. Потім ви можете змінити стиль на щось, що також виглядає вимкненим. Використання jQuery:

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

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

-8

Інший варіант - використовувати атрибут 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#successful-controls


6
Елемент керування НЕ виділяється в сірий колір, і користувач може його редагувати. Вам не вдалося прочитати весь розділ, і я цитую: "Наступні елементи підтримують атрибут readonly: INPUT та TEXTAREA."
Карлос Рендон

3
Я знаю, що це стара відповідь, але це насправді працює. Я не знаю причини багатьох попутів.
Зе Луїс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.