Ввімкнено форми введення не відображаються в запиті


340

У мене є деякі відключені входи у формі, і я хочу надіслати їх на сервер, але Chrome виключає їх із запиту.

Чи можливе вирішення цього питання, не додаючи приховане поле?

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />

    <!-- this does not appear in request -->
    <input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

</form>


2
@Liam, дуже дивна спроба закрити на користь менш відвідуваного питання з нижчою якістю відповідей.
hazzik

Старше менш присутній питання. Технічно це питання повинно було бути закритим як дублікат, коли його задавали. Я позначив його модом для потенційного злиття, може, а може і не відбутися. Це залежить від них.
Ліам

@Liam насправді питання різні, навіть деякі відповіді виглядають схоже. Я запитую про те, як змусити "інвалідне" поле для подання значень, а інше питання задає "причини"
hazzik

Потрапив сюди лише після того, як я провів кілька годин, намагаючись вирішити це. Е-е-е ..
матчек

Відповіді:


729

Елементи з disabledатрибутом не подаються або ви можете сказати, що їх значення не розміщені (див. Другу точку пункту під кроком 3 у специфікації HTML 5 для побудови набору даних форми ).

Тобто,

<input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

FYI, за 17.12.1 у специфікації HTML 4:

  1. Інвалідні елементи керування не отримують фокус.
  2. У вікні навігації з вкладками пропускаються елементи інвалідів.
  3. Інвалідні елементи керування не можуть бути успішно розміщені.

Ви можете використовувати readonlyатрибут у своєму випадку, виконавши це, ви зможете розміщувати дані свого поля.

Тобто,

<input type="textbox" name="Percentage" value="100" readonly="readonly" />

FYI, за 17.12.2 у специфікації HTML 4:

  1. Елементи лише для читання отримують фокус, але користувач не може їх змінювати.
  2. Елементи лише для читання включені в навігацію по вкладках.
  3. Елементи лише для читання успішно розміщуються.

8
Щоб відповісти на моє власне запитання: Ні, readony працює лише для <введення /> управління формами type = 'text' і type = 'password', а також для <textarea />. Що тільки читає, це заважає користувачеві змінювати значення елементів керування. Забороняти користувачеві змінювати значення прапорця (або введення радіо типу) не має особливого сенсу ...
Muleskinner

3
@ danielson317 Ви можете зберегти вибраний елемент "вимкнено", але також додати ще один прихований вхід з тим же значенням.
AlphaMale

1
@AlphaMale Але прихований елемент не може мати однакове ім’я (або не повинен). Я пройшов це, дозволивши елементу бути порожнім і просто виводити початкове значення зі збереженого стану форми. Варто лише зауважити, що лише на деяких елементах форми не працює.
danielson317

2
Чи знайдете ви коли-небудь щось і думаєте: "Що в біса змусило їх подумати, що це буде очевидно?" Якщо я зіткнувся з проблемою, включаючи поле введення, яке може бути або не може бути відключене, це означає, що я не хочу, щоб користувач міняв це, не те, що він повинен ефективно діяти так, ніби він взагалі ніколи не був оголошений!
Нік Бедфорд

1
Дякую, що це було корисно, і відповідь, і відповідь.
користувач1449249

25

Використовуючи Jquery та надсилаючи дані за допомогою ajax, ви можете вирішити свою проблему:

<script>

$('#form_id').submit(function() {
    $("#input_disabled_id").prop('disabled', false);

    //Rest of code
    })
</script>

+1 хороша річ у цьому рішенні - це те, що ви все ще можете використовувати червоний значок відключення, коли користувач надходить на вхід =)
JMASTER B

5
@ArielMaduro ви можете зробити це за допомогою csscursor:not-allowed;
sricks

@sricks ох дійсно ?? Чи можете ви навести приклад?
JMASTER B

подобається це рішення більше, ніж використовувати лише для читання лише тому, що відключені поля не можуть отримати фокус
Андреас

9

Щоб розміщувати значення з вимкнених входів на додаток до ввімкнених входів, ви можете просто знову ввімкнути всі введення форми під час подання.

<form onsubmit="this.querySelectorAll('input').forEach(i => i.disabled = false)">
    <!-- Re-enable all input elements on submit so they are all posted, 
         even if currently disabled. -->

    <!-- form content with input elements -->
</form>

Якщо ви віддаєте перевагу jQuery:

<form onsubmit="$(this).find('input').prop('disabled', false)">
    <!-- Re-enable all input elements on submit so they are all posted, 
         even if currently disabled. -->

    <!-- form content with input elements -->
</form>

Для ASP.NET MVC C # Razor ви додаєте обробник подачі так:

using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post,
    // Re-enable all input elements on submit so they are all posted, even if currently disabled.
    new { onsubmit = "this.querySelectorAll('input').forEach(i => i.disabled = false)" } ))
{
    <!-- form content with input elements -->
}

є одна з цитат на варіант jquery
cagcak

8

Якщо ви абсолютно повинні вимкнути поле і передати дані, ви можете використовувати javascript для введення тих же даних у приховане поле (або просто встановити приховане поле також). Це дозволить вам вимкнути його, але все-таки опублікувати дані, навіть якщо ви надсилаєте повідомлення на іншу сторінку.


1
Це рішення я теж використовував - але, як я щойно дізнався - властивість readonly є набагато кращим рішенням
Muleskinner

4

Я актуалізую цю відповідь, оскільки дуже корисна. Просто додайте лише вхід до читання.

Тож форма буде:

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />
    <input type="textbox" name="Percentage" value="100" readonly/>
</form>

4

Семантично це відчуває як правильна поведінка

Я б запитав себе " Чому мені потрібно подати це значення? "

Якщо у вас вимкнено вхід у формі, то, мабуть, ви не хочете, щоб користувач змінює значення безпосередньо

Будь-яке значення, яке відображається на вимкненому вході, має бути або

  1. висновок зі значення на сервері, який видав форму, або
  2. якщо форма динамічна, можна підрахувати за іншими вхідними даними форми

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

Насправді, щоб зберегти цілісність даних - навіть якщо значення відключеного вводу було надіслано на сервер обробки даних, ви дійсно повинні його перевірити. Ця перевірка вимагає такого ж рівня інформації, як і вам потрібно було б відтворити значення в будь-якому випадку!

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

Рада виправитись, але всі випадки використання, які я можу придумати, де потрібно надсилати введення лише для читання / відключення, - це справді просто проблеми стилізації у маскуванні


1
не забувайте, що цінністю можна керувати безпосередньо інструментами для розробників хрому
jimjim

2

Мені здається, це працює легше. лише читайте поле введення, а потім стилюйте його, щоб кінцевий користувач знав, що це лише для читання. Вхідні дані, розміщені тут (наприклад, від AJAX), все ще можуть надсилати без додаткового коду.

<input readonly style="color: Grey; opacity: 1; ">

-6

Ви можете повністю уникнути відключення, боляче, оскільки формат форми HTML не надсилатиме нічого, пов’язаного з <p>якоюсь іншою міткою.

Таким чином, ви можете замість цього ставити звичайні

<input text tag just before you have `/>

додайте це readonly="readonly"

Він не відключить ваш текст, але не зміниться користувачем, щоб він працював як <p>і буде надсилати значення через форму. Просто видаліть рамку, якщо ви хочете зробити її більше схожою на <p>тег

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