Чому перемикачі радіо не можуть бути "лише для читання"?


214

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

Чи є якийсь дивний трюк, який мені потрібно витягнути, щоб працювати лише для читання, як очікувалося? Чи повинен я просто зробити це в JavaScript?

До речі, хтось знає, чому лише функція читання не працює в радіо кнопок, а в інших тегах вводу? Це один із тих незрозумілих недоліків у специфікаціях HTML?


5
"Це один із тих незрозумілих упущень у специфікаціях HTML?" Подумайте про це з точки зору користувача. Чому відображати кнопку, яку вони не можуть натиснути?
Пол Д. Уейт

67
Чому відображати кнопку, яку вони не можуть натиснути? Тому що я хочу, щоб вони знали, що кнопка є, але я не хочу, щоб вони могли натиснути її прямо зараз. Але, можливо, пізніше. Зрештою, це динамічна форма. Чому перемикач може відрізнятися від будь-якого іншого поля введення?
mcv

7
Ось специфікація: w3.org/TR/html401/interact/forms.html#h-17.12.2 "Наступні елементи підтримують атрибут readonly: INPUT та TEXTAREA." Що, очевидно, неправильно. Повернення сюди, однак, ми бачимо більш точний підсумок: w3.org/TR/WD-forms-970402#readonly "НАЙКРАДНО застосовується до елементів INPUT типу TEXT або PASSWORD та до елемента TEXTAREA." Схоже, це прослизнуло між прогалинами записів та специфікацій.
graphicsdivine

Ще цікавіше. Відповідно до цього стародавнього документа "Наприклад, у вікнах, які ви можете встановити, ви можете перевірити їх і вимкнути (встановивши таким чином стан CHECKED), але значення поля не зміниться." ( htmlcodetutorial.com/forms/_INPUT_DISABLED.html ) Це правда? Чи налаштовано НАЙКРАДНО на прапорці / радіоблокуванні значення, навіть якщо користувач може, очевидно, змінити його?
graphicsdivine

перевірити мій пост [тут] [1] дає чисте просте рішення проблеми [1]: stackoverflow.com/a/15513256/1861389
driven4ward

Відповіді:


149

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

Використовуючи jQuery, щоб зробити лише читання:

$(':radio:not(:checked)').attr('disabled', true);

Цей підхід також працював для того, щоб переглядати список вибору лише заново, за винятком того, що вам потрібно буде вимкнути кожен не вибраний варіант.


2
Дякую @Megan, це чудове рішення
Майкл Ла

9
Варіант цього варіанту дозволить вам використовувати readonlyмайно, оскільки ОП очікувало, що воно буде працювати:$(':radio[readonly]:not(:checked)').attr('disabled', true);
wodow

1
Серед наведених нижче рішень це рішення забезпечує найчистіший код і добре працює з валідатором Jquery, оскільки мені не потрібно вмикати / відключати поля, не мати справу з розв’язуванням подій клацання та повторним зв'язуванням їх під час подання форми.
Крістіанне Нерона

Працює точно. Спасибі
Хассан Фарук

Розумний! Використовуючи .not (..), якщо у вас вже є набір вибраних полів введення: var myRadios = $ ('# specific-radios'); myRadios.not (': перевірено'). prop ('вимкнено', правда); api.jquery.com/not
JoePC

207

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

<input type="radio" name="foo" value="Y" checked>
<input type="radio" name="foo" value="N" disabled>

Fiddle: http://jsfiddle.net/qqVGu/


3
Проблема з вашим першим рішенням полягає в тому, що якщо я хочу ввімкнути радіову кнопку через javascript, у мене раптом з’являються два поля з однаковою назвою, тому я маю очистити одне з них. Або скористайтеся прихованим дійсним і перемикач просто встановить значення прихованого поля. Ефірний спосіб - це просто трохи громіздкіше, ніж я хотів би бути радіоконтролером. Ваше друге рішення, хоча я не сумніваюся, що воно працює, звучить як справді некрасивий злом. Тож я думаю, що рішення JavaScript - єдине, що відповідає моїм критеріям. Я піду з цим.
mcv

7
Рішення 1, будь ласка! Це єдиний правильно доступний. І якщо вам потрібно його скриптувати, це лише ще один рядок, щоб встановити включеність прихованого поля на протилежну до можливостей радіо.
bobince

5
Я щойно помітив, що рішення 2 і 3 змінили місця у відповіді Джонатана, тому зараз коментарі не мають особливого сенсу.
mcv

1
Хочете помітити, що рішення Javascript не працює, воно просто знімає кнопку. Я припускаю, що це потрібно onclick="return false"для запобігання змін.
Дмитрій

2
Коли я встановлюю радіо "вимкнено", я додаю "style = cursor: default", щоб видалити "курсор вимкнено".
Жоао Пауло

24

Це трюк, з яким можна піти.

<input type="radio" name="name" onclick="this.checked = false;" />

4
Точно про що я думав, але найкраще було б, якщо ви уточнили, що це має бути onClick="this.checked = <%=value%>"якась різноманітність :)
JustLoren

це чудово знати. перевірений може мати істинне або хибне значення.
Сарфраз

Просто попередження, що це не буде працювати для тих із нас, хто переглядає javascript, не включений за замовчуванням.
tloach

3
Не проблема для мого випадку. Ми вже використовуємо тонни jQuery та Ajax.
mcv

1
Варто зазначити, що ви можете просто зробити так, onclick="return false;"щоб значення було однаковим для групи
Зак

12

У мене є довга форма (250+ полів), яка розміщує повідомлення на db. Це онлайн-додаток для працевлаштування. Коли адміністратор перегляне подану програму, форма заповнюється даними з db. Тексти та текстові тексти введення замінюються текстом, який вони надсилають, але радіо та прапорці корисно зберігати як елементи форми. Вимкнення їх ускладнює читання. Якщо встановити властивість .визначається помилковим onclick, не вийде, оскільки їх, можливо, перевірив користувач, що заповнює додаток. У всякому разі ...

onclick="return false;"

працює як принадність для відключення радіостанцій та прапорців ipso facto.


8

Найкращим рішенням є встановити перевірений або неперевірений стан (від клієнта чи сервера) і не дозволяти користувачеві змінювати його після того, як підопічні (тобто зробити це лише для читання):

<input type="radio" name="name" onclick="javascript: return false;" />

немає! у цьому випадку користувач може редагувати html у браузері, позначити потрібну опцію як обрану та розмістити форму.
помилка1009

2

Я придумав важкий для Javascript спосіб досягти стану лише для читання для прапорців і радіо кнопок. Він протестований на поточних версіях Firefox, Opera, Safari, Google Chrome, а також на поточній та попередній версіях IE (аж до IE7).

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

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

За допомогою подій onmousedown ви можете прочитати стан вибору, перш ніж дія кліку змінить його. Таким чином, ви зберігаєте цю інформацію, а потім відновите ці стани за допомогою події onclick.

<input id="r1" type="radio" name="group1" value="r1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="r2" type="radio" name="group1" value="r2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="r3" type="radio" name="group1" value="r3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 3</input>

<input id="c1" type="checkbox" name="group2" value="c1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="c2" type="checkbox" name="group2" value="c2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="c3" type="checkbox" name="group2" value="c3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 3</input>

Потім частина цього JavaScript працюватиме так (знову лише поняття):

var selectionStore = new Object();  // keep the currently selected items' ids in a store

function storeSelectedRadiosForThisGroup(elementName) {
    // get all the elements for this group
    var radioOrSelectGroup = document.getElementsByName(elementName);

    // iterate over the group to find the selected values and store the selected ids in the selectionStore
    // ((radioOrSelectGroup[i].checked == true) tells you that)
    // remember checkbox groups can have multiple checked items, so you you might need an array for the ids
    ...
}

function setSelectedStateForEachElementOfThisGroup(elementName) {
    // iterate over the group and set the elements checked property to true/false, depending on whether their id is in the selectionStore
    ...

    // make sure you return false here
    return false;
}

Тепер ви можете увімкнути / відключити радіо кнопки / прапорці, змінивши властивості onclick та onmousedown вхідних елементів.


2

Для вибраних радіо кнопок позначте їх як відключені. Це не дозволяє їм реагувати на введення користувача та очищати перевірену радіо кнопку. Наприклад:

<input type="radio" name="var" checked="yes" value="Yes"></input>
<input type="radio" name="var" disabled="yes" value="No"></input>

4
checked="yes"? Що це за специфікація? Або використовуйте checked="checked"або просто атрибут checkedбез значення. Те саме для disabled.
Робін ван Баален

2

Шлях JavaScript - це працювало для мене.

<script>
$(document).ready(function() {
   $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); });
});
</script>

Причина:

  1. $('#YourTableId').find('*') -> це повертає всі теги.

  2. $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); }); ітератує над усіма об'єктами, захопленими в цьому, і вимикає вхідні теги.

Аналіз (налагодження):

  1. form:radiobutton внутрішньо розглядається як тег "введення".

  2. Як і у наведеній вище функції (), якщо ви спробуєте друкувати document.write(this.tagName);

  3. Де б у тегах він не знаходив радіо кнопки, він повертає тег введення.

Отже, вище кодовий рядок можна оптимізувати для тегів радіо кнопок, замінивши * на введення: $('#YourTableId').find('input').each(function () { $(this).attr("disabled", true); });


1

Досить простим варіантом було б створити функцію javascript, яка називається у події "onsubmit" форми, щоб включити радіову кнопку назад, щоб її значення було розміщено з рештою форми.
Здається, це не є упущенням специфікацій HTML, але вибір дизайну (логічний IMHO) радіо-кнопки неможливо прочитати лише тому, що кнопкою не може бути, якщо ви не хочете ним користуватися, то відключити його.


1

Я виявив, що використання onclick='this.checked = false;'працює певною мірою. Натиснута радіо-кнопка не буде обрана. Однак, якщо вже була обрана радіо-кнопка (наприклад, значення за замовчуванням), цей перемикач стане невибраним.

<!-- didn't completely work -->
<input type="radio" name="r1" id="r1" value="N" checked="checked" onclick='this.checked = false;'>N</input>
<input type="radio" name="r1" id="r1" value="Y" onclick='this.checked = false;'>Y</input>

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

<!-- preserves pre-selected value -->
<input type="radio" name="r1" id="r1" value="N" checked="checked">N</input>
<input type="radio" name="r1" id="r1" value="Y" disabled>Y</input>

Це рішення - не найелегантніший спосіб запобігти зміні значення за замовчуванням, але він буде працювати, включений чи ні JavaScript.


1

Спробуйте атрибут disabled, але я думаю, що значення радіо кнопок ви не отримаєте. Або встановіть зображення замість цього:

<img src="itischecked.gif" alt="[x]" />radio button option

З найкращими побажаннями.


1
о, мій html-код був знятий: img src = "itIsChecked.gif" alt = "[x]" OptionChecked
Тім

0

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

if ($(node).prop('readonly')) {
    $(node).parent('div').addClass('disabled'); // just styling, appears greyed out
    $(node).on('click', function (e) {
        e.preventDefault();
    });
}

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