Можно ли установить флажки HTML только для чтения?

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

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

(Вредоносный) клиент всегда может изменить значение флажка (или отправить произвольный запрос). Всегда проверяйте правильность проверки на стороне сервера!

knittl 20.08.2013 11:40

@knittl Но у обычного посетителя нет (вредоносного) клиента. А нормальный Вистор не хотел менять информацию (в этом смысл readonly)

Christian Gollhardt 27.05.2014 13:00

@ChristianGollhardt: но тогда вам не нужно отправлять значение флажка с запросом, поскольку они всегда должны быть начальным значением.

knittl 27.05.2014 15:23

@knittl Вы, кажется, полностью игнорируете readonly! Зачем тогда мог бы существовать этот атрибут!

Izhar Aazmi 05.08.2014 07:13

@IzharAazmi: readonly - это только атрибут на стороне клиента, который помогает браузеру правильно отображать сайт и затем создавать из него правильный запрос. Сервер не может и не должен знать об атрибуте readonly отображаемой страницы. Он должен предполагать, что запрос пришел откуда угодно (и, возможно, со злым умыслом); никогда не полагайтесь на вводимые пользователем данные. Тем не менее, зачем отправлять значение флажка, которое вы не можете редактировать в запросе (если вы устанавливаете значение перед рендерингом, вы уже знаете значение при отправке запроса, поэтому нет необходимости передавать его в запросе)

knittl 05.08.2014 10:16

@knittl Согласен! Но вы видите, что атрибут readonly по какой-то причине существует. Это, конечно, не имеет ничего общего с реализацией на стороне сервера. Но он там, чтобы сказать пользователю: «Эй! Это значение предполагается здесь, и / но вы не можете его изменить».

Izhar Aazmi 05.08.2014 13:40

@IzharAazmi, он просто напомнил тебе. Я обошел многие вещи, отредактировав только чтение / отключено или добавив пользовательские значения в <select>

Tomáš Zato - Reinstate Monica 03.12.2014 04:16

дубликат stackoverflow.com/questions/12267242/…

Patrick Lee Scott 05.07.2016 22:22

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

Qwertiy 05.03.2019 21:38

Поскольку я не часто имею дело с флажками, я забываю об этом беспорядке и делаю ошибку. Мне пришлось поместить предупреждение в свой основной файл js, чтобы напомнить мне, если я случайно сделаю «только для чтения» на одном из них. Вот он: ** let cbox = $ ("input: checkbox"); if ($ (cbox) .prop ('readonly')) {alert ("Флажок НЕ МОЖЕТ иметь свойство только для чтения. Исправьте!")}; **

McAuley 04.10.2019 21:05

@knittl Можно просто изменить его на «зачем отправлять НИЧЕГО, что вы не можете редактировать». Давайте забудем об отправке любых данных статической формы, потому что мы всегда можем написать тонну странного кода, чтобы сообщить серверу: «Я не получил это поле, поэтому я должен повторно запросить свою базу данных, чтобы получить фактическое значение, когда я выполняю динамические обновления. ". Серьезно, это именно то, что есть - кто-то решил не устанавливать флажок «только для чтения» по причинам, которые ускользают от меня и большинства людей. Возможно, это связано с пивом или травяными добавками. Мне это не нравится, потому что это сбивает с толку. Здесь идет обсуждение WC3: github.com/w3c/html/issues/92

McAuley 04.10.2019 21:19

(@) Квиртий. Чтобы сделать выбор однозначным, лучше всего принудительно выбрать его с помощью переключателей. Однако лучше всего было бы принудительно принять явное решение, выполнив следующие действия: 1. Первоначально не отмечая кнопки. 2. Если опция не была выбрана при отправке, код сервера может повторно представить страницу.

Patanjali 04.02.2020 06:02
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
864
12
966 290
45

Ответы 45

READONLY не работает с флажками, поскольку он не позволяет вам редактировать ценить поля, но с флажком вы фактически редактируете состояние поля (on || off)

От faqs.org:

It's important to understand that READONLY merely prevents the user from changing the value of the field, not from interacting with the field. In checkboxes, for example, you can check them on or off (thus setting the CHECKED state) but you don't change the value of the field.

Если вы не хотите использовать disabled, но все же хотите отправить значение, как насчет того, чтобы отправить значение как скрытое поле и просто распечатать его содержимое для пользователя, когда они не соответствуют критериям редактирования? например

// user allowed change
if ($user_allowed_edit)
{
    echo '<input type = "checkbox" name = "my_check"> Check value';
}
else
{
    // Not allowed change - submit value..
    echo '<input type = "hidden" name = "my_check" value = "1" />';
    // .. and show user the value being submitted
    echo '<input type = "checkbox" disabled readonly> Check value';
}

Работает, но это вроде .. ну грязно, только для чтения на флажках должно просто делать то, что подсказывает интуиция.

levhita 17.12.2008 00:41

Интуиция обманывает нас, как объяснил ConroyP.

ANeves thinks SE is evil 05.05.2010 22:52

Интуиция не обманула нас, она обманула тех, кто так реализовал чекбокс.

Califf 21.09.2013 19:51

@ConroyP -> "он не позволяет вам редактировать значение поля, но с помощью флажка вы фактически редактируете состояние поля (включено || выключено)". Это действительно слабое оправдание тупого решения. «Состояние» и «значение» для большинства из нас во многом такие же, как «toMAYto» и «toMAHto», как вы можете видеть по голосам тех, кто не согласен.

McAuley 05.10.2019 08:21

Нет, но вы можете использовать события javascript для достижения чего-то подобного.

I just don't want the client to be able to change them under certain circumstances.

READONLY сам по себе работать не будет. Вы можете сделать что-нибудь интересное с CSS, но мы обычно просто отключаем их.

ВНИМАНИЕ: если они отправлены обратно, клиент может их изменить, точка. Вы не можете полагаться только на чтение, чтобы помешать пользователю что-то изменить. Всегда можно использовать скрипач или просто передать html с firebug или что-то в этом роде.

Вы совершенно правы, поэтому я также проверяю это на стороне сервера, устанавливая это просто для улучшения взаимодействия с пользователем на стороне клиента.

levhita 17.12.2008 00:42

Это флажок, который нельзя изменить:

<input type = "checkbox" disabled = "disabled" checked = "checked">

Просто добавьте disabled = "disabled" как атрибут.


Отредактируйте, чтобы учесть комментарии:

Если вы хотите, чтобы данные были отправлены обратно, простое решение - применить то же имя к скрытому входу:

<input name = "myvalue" type = "checkbox" disabled = "disabled" checked = "checked"/>
<input name = "myvalue" type = "hidden" value = "true"/>

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

Обратите внимание, что флажок «отключено» не отправляет значение через данные POST.

biphobe 20.09.2011 17:56

@powtac Вы не указали, что он хочет, чтобы данные были опубликованы, ваш пример этого не делает.

David Mårtensson 08.02.2012 20:59

Невозможно, чтобы этот ответ получил 105 голосов. Это идет вразрез со всем, что говорится в ОП.

JM4 12.12.2012 21:18

Почему за этот ответ так много голосов? в вопросе четко сказано, что инвалид не служит цели!

Akshay 26.04.2013 15:19

@AkshaySinghal, потому что он служит цели для других людей, которые не являются оператором!

nathan hayfield 08.06.2013 01:22

@nathanhayfield: по этой логике я смогу публиковать полезные ответы на тему Любые и получать голоса за. :(

Michael Bray 23.07.2013 03:39

@MichaelBray Я предполагаю, что это набирает много голосов, потому что многие люди хотят знать, как сделать флажки доступными только для чтения, поэтому они делают следующее: 1) Google «Флажок только для чтения». 2) Убедитесь, что заголовок этого вопроса соответствует тому, что они хотят сделать, и щелкните по нему. 3) Прокрутите вниз, пока не найдете этот ответ. 4) Счастья и поддержки.

Mark Byers 22.08.2013 14:22

Это искажает значение - всегда отправляет ЛОЖЬ

Marco Prins 16.07.2014 17:17

Согласившись с @ JM4, этот ответ полностью противоречит вопросу. Может все еще быть полезным, но - проголосовали против: - /

Cody 12.09.2014 20:17

@ JM4 Да, за него следует проголосовать против, и я использую в нем свой первый голос против! :) (и я не теряю репутацию ?! Думаю, я не могу проиграть меньше 125).

Rafael Barros 25.09.2014 00:13

Предположительно, вы можете просто добавить скрытый ввод (со значением «off» и тем же именем, что и флажок) прямо перед флажком, и он будет отправлен, когда флажок не установлен. Никакого JavaScript, просто использование того факта, что будет отправлено последнее поле с определенным значением имени. Он фактически дает вам флажок, который отправляет значение, когда он не установлен. Что такое хакерский HTML.

Triynko 05.01.2016 19:08

Дополнительное примечание, просто чтобы сообщить об этом где-нибудь: также кажется, что (по крайней мере, в Chrome), когда флажок отключен, вы не можете сфокусировать его (это нормально), но вы даже не можете сфокусировать его соответствующий label, даже добавив к нему tabindex = "0" !! (это не нормально)

Kamafeather 06.01.2016 17:41

Я хотел бы добавить, что создание скрытого поля, позволяющего передавать значение, может нарушить любую проверку или другие ожидания сценариев. Если вы ожидаете группу флажков и взаимодействуете с ними (ищите их состояние / значение и т. д.), Просмотр СКРЫТОГО поля с тем же именем, что и флажки, означает, что данные / параметры этого элемента управления должны обрабатываться независимо от флажки.

Gary Richter 10.03.2016 19:00

Он получил от меня положительный голос, потому что он подходит для того, для чего мне это нужно - я использую флажок как состояние на странице, обращенной к пользователю, но значение (если оно не только для чтения) в любом случае уже помещается в другое поле , поэтому меня не волнует значение самого поля флажка. :)

neminem 18.08.2017 01:48

Иногда вам не важны значения формы, например, если флажки поддерживаются объектом reactive, и вы не собираетесь отправлять какую-либо форму, используя данные формы, а скорее реактивный объект.

Dexygen 14.11.2017 18:50

@GaryRichter. На самом деле атрибут name для флажка не требуется. А поскольку снятый флажок вообще не публикуется, скрытый ввод следует использовать только тогда, когда этот флажок установлен. Также значением флажка может быть любой текст. Смотрите мой ответ для полного подхода, без вводящих в заблуждение придатков!

Patanjali 27.05.2019 12:06

@Patanjali правильно, атрибут имени не требуется. Но OP первоначально спросил, можно ли установить для них значение READONLY (что не является допустимым атрибутом флажка), и упомянул, что они действительно хотят, чтобы флажок был представлен в форме (что означает, что у него должно быть имя). Реализация скрытого поля может быть немного взломана, особенно если пользователь взаимодействует со списком флажков, а не только с одним элементом управления. Я хотел сказать, что этот ответ может работать в очень узком масштабе и создаст другие проблемы, которые необходимо учитывать в зависимости от реализации.

Gary Richter 31.05.2019 16:59

Это представляет собой небольшую проблему с удобством использования.

Если вы хотите отобразить флажок, но не позволять ему взаимодействовать, зачем тогда вообще флажок?

Однако мой подход заключался бы в использовании отключенного (пользователь ожидает, что отключенный флажок будет недоступен для редактирования, вместо того, чтобы использовать JS, чтобы активированный не работал), и добавить обработчик отправки формы с помощью javascript, который включает флажки прямо перед формой Отправлено. Таким образом вы публикуете свои ценности.

т.е. что-то вроде этого:

var form = document.getElementById('yourform');
form.onSubmit = function () 
{ 
    var formElems = document.getElementsByTagName('INPUT');
    for (var i = 0; i , formElems.length; i++)
    {  
       if (formElems[i].type == 'checkbox')
       { 
          formElems[i].disabled = false;
       }
    }
}

Другой вариант - отобразить отключенный флажок (или изображение или что-нибудь для обозначения отмеченного / снятого флажка) и иметь скрытый ввод, который обрабатывается сервером.

Juan Mendes 02.04.2010 19:55

Это не проблема удобства использования, когда у вас есть форма, в которой часть вашего решения влияет на некоторые другие входные данные (также как: установка значения, которое нельзя коснуться, если вы не отмените свое первое действие). Ненавижу, когда люди пытаются изменить мнение людей вместо ответа (это не о тебе, @FlySwat, ты ответил).

Pherrymason 07.10.2010 18:01

Цель состоит в том, чтобы использовать флажок в качестве поля отображения «это значение истинно», которое легче просмотреть по таблице, чем связку «истина» / «ложь». Конечно, вы можете использовать значок, но в форме флажки кажутся готовыми для использования.

Olie 14.08.2011 00:13

@FlySwat: +1 для меня это лучшее решение, и его также можно использовать для списка <SELECT> и других типов полей <INPUT>, см. Здесь: stackoverflow.com/q/1191113/260080

Marco Demaio 10.11.2011 15:50

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

systempuntoout 29.11.2012 03:00

+2 для части "почему бы не использовать", -1 для части кода = +1

Christian Gollhardt 27.05.2014 13:05

Предположим, у вас есть ряд «функций», которые могут быть включены или нет, поэтому у вас есть шаблон с флажком для функции. Но иногда функция является предпосылкой для чего-то еще ... поэтому она ДОЛЖНА быть включена, но вы не хотите изменять свой шаблон. Именно для этого нужен флажок отключен / установлен. Они существуют всегда, так что я надеюсь, что вопрос «зачем вообще галочка» был риторическим.

Triynko 05.01.2016 19:12

Функция флажка существовала еще до появления программирования (ее можно было увидеть на каждой блок-схеме процесса, связанной с принятием решений), и тем более до появления интерфейса на основе Windows три десятилетия назад. И они оказались визуальным эликсиром, почти неотъемлемой частью программирования графического интерфейса. Если я хочу сообщить пользователю, что определенная цена была доступна в течение предыдущего периода, но недоступна сейчас, что может быть лучше, чем отображать отключенный флажок "установлен"?

user12379095 04.05.2020 20:14

Вы всегда можете использовать небольшое изображение, похожее на флажок.

Сложность использования изображения флажка заключается в том, что сам флажок отображается браузером. Некоторые браузеры просто используют собственные элементы управления из ОС, но другие рисуют свои собственные стильные элементы управления. Таким образом, изображение вашего флажка не будет выглядеть так же, как другие флажки на странице в некоторых браузерах. Конечно, вы можете заменить все флажки на странице своим стилем ...

Mnebuerquo 26.09.2009 09:38

Признаюсь, это не худший ответ. Прошло 7 лет, а в HTML до сих пор нет простого и понятного способа сделать флажки «только для чтения». Вместо того, чтобы помещать тонны javascript, который в любом случае будет отключен noscript, и создавать фальшивые скрытые флажки, вы можете просто удалить этот флажок и поместить изображение или текст, указывающий, что выбора нет. Мне также интересно, увижу ли я какой-нибудь идеальный ответ на этот вопрос, прежде чем умру от старости или нет.

user619271 14.03.2015 23:45

<input type = "checkbox" onclick = "this.checked=!this.checked;">

Но вы ОБЯЗАТЕЛЬНО ДОЛЖНЫ проверить данные на сервере, чтобы убедиться, что они не были изменены.

Я нашел это лучшим решением; Кроме того, я могу вызвать другой фрагмент кода (скажем, какой-нибудь jquery-материал), чтобы отобразить симпатичный маленький знак, который говорит: «Вы не можете изменить это, пока сначала не выполните x». Что-то вроде: "... onclick = 'this.checked =! This.checked; javascript: theCheckboxWasClicked ();' ..."

Bane 23.03.2011 21:47

Это не серые поля, как в случае с ответом от powtac, поэтому он получил мой голос

EHarpham 29.06.2013 21:10

Это немного хакерский, но гениальный, идеальный, почти элегантный хакер.

russell 02.12.2013 04:50

Лучшее решение. Должен быть отмечен как правильный ответ.

Scottie 15.12.2014 19:00

Как указано выше, это не работает при двойном щелчке в IE. Я использовал: onchange = "this.checked = true;"

Ritikesh 01.05.2015 16:32

Почему у вас this.checked=!this.checked? Разве нельзя просто false? Кроме того, я почти уверен, что точка с запятой не нужна

Solomon Ucko 06.11.2016 00:39

При отправке флажка HTML на сервер он имеет строковое значение 'on' или ''.

Только чтение не останавливает пользователя, редактирующего флажок, а отключение останавливает отправку значения обратно. Один из способов обойти это - иметь скрытый элемент для хранения фактического значения, а отображаемый флажок - фиктивный, который отключен. Таким образом, состояние флажка сохраняется между сообщениями.

Вот функция для этого. Он использует строку «T» или «F», и вы можете изменить это как хотите. Это использовалось на странице ASP с использованием сценария VB на стороне сервера.

public function MakeDummyReadonlyCheckbox(i_strName, i_strChecked_TorF)

    dim strThisCheckedValue

    if (i_strChecked_TorF = "T") then
        strThisCheckedValue = " checked "
        i_strChecked_TorF = "on"
    else
        strThisCheckedValue = ""
        i_strChecked_TorF = ""
    end if

    MakeDummyReadonlyCheckbox = "<input type='hidden' id='" & i_strName & "' name='" & i_strName & "' " & _
        "value='" & i_strChecked_TorF & "'>" & _
    "<input type='checkbox' disabled id='" & i_strName & "Dummy' name='" & i_strName & "Dummy' " & _
        strThisCheckedValue & ">"   
end function

public function GetCheckbox(i_objCheckbox)

    select case trim(i_objCheckbox)

        case ""
            GetCheckbox = "F"

        case else
            GetCheckbox = "T"

    end select

end function

Вверху страницы ASP вы можете выбрать сохраненное значение ...

strDataValue = GetCheckbox(Request.Form("chkTest"))

и когда вы хотите вывести свой флажок, вы можете сделать это ...

response.write MakeDummyReadonlyCheckbox("chkTest", strDataValue)

Я протестировал это, и он отлично работает. Он также не полагается на JavaScript.

Не отмеченный флажок игнорируется при публикации формы владения. Нет никакой переменной, не говоря уже о значении.

Patanjali 27.05.2019 11:22

<input name = "isActive" id = "isActive" type = "checkbox" value = "1" checked = "checked" onclick = "return false"/>

Если вам нужно, чтобы флажок был отправлен вместе с формой, но фактически доступен только для чтения пользователю, я рекомендую отключить их и использовать javascript, чтобы повторно включить их при отправке формы.

Это по двум причинам. Во-первых, что наиболее важно, вашим пользователям будет выгодно видеть видимую разницу между флажками, которые они могут изменять, и флажками, доступными только для чтения. Disabled делает это.

Вторая причина заключается в том, что отключенное состояние встроено в браузер, поэтому вам нужно меньше кода для выполнения, когда пользователь что-то нажимает. Вероятно, это больше личное предпочтение, чем что-либо еще. Вам все равно понадобится JavaScript, чтобы отключить их при отправке формы.

Мне кажется проще использовать какой-нибудь javascript при отправке формы, чтобы отключить флажки, чем использовать скрытый ввод для переноса значения.

Не приведет ли это к тому, что они ненадолго перейдут во включенное состояние при отправке формы?

Lawrence Dol 04.10.2013 02:23

Мое решение на самом деле противоположно решению FlySwat, но я не уверен, сработает ли оно в вашей ситуации. У меня есть группа флажков, и у каждого есть обработчик onClick, который отправляет форму (они используются для изменения настроек фильтра для таблицы). Я не хочу разрешать множественные щелчки, поскольку последующие щелчки после первого игнорируются. Поэтому я отключаю все флажки после первого щелчка и после отправки формы:

onclick = "document.forms['form1'].submit(); $('#filters input').each(function() {this.disabled = true});"

Флажки находятся в элементе span с идентификатором «filter» - вторая часть кода представляет собой оператор jQuery, который выполняет итерацию по флажкам и отключает каждый из них. Таким образом, значения флажков по-прежнему отправляются через форму (поскольку форма была отправлена ​​до их отключения), и это не позволяет пользователю изменять их до перезагрузки страницы.

<input type = "checkbox" readonly = "readonly" name = "..." />

с jquery:

$(':checkbox[readonly]').click(function(){
            return false;
        });

по-прежнему может быть хорошей идеей дать визуальный намек (css, текст, ...), что элемент управления не принимает входные данные.

У меня это не сработало в ie6, фильтр атрибутов readonly работает некорректно. Я вынул это из фильтра и поместил проверку атрибутов в тело функции, и она отлично работает в ie6.

gt124 16.06.2010 21:44

Я использовал data-readonly = true вместо стандартного атрибута, и он отлично работает во всех браузерах. Мне это решение нравится больше, чем другие, перечисленные выше +1

peipst9lker 26.10.2012 14:20

Селектор должен быть $(':checkbox[readonly]') для выбора всех возможных флажков, поскольку значение атрибута readonly является необязательным.

Izhar Aazmi 16.12.2014 13:07

onclick = "javascript: return false;"

Хммм ... это работает для случая false / unchecked, но onclick = "javascript: return true;" просто заставляет его действовать как обычный флажок. Подсказки? Спасибо!

Olie 14.08.2011 00:46

@Olie, добавьте атрибут checked и оставьте false на месте.

Qwertiy 07.06.2019 22:10

Схема javascript: не требуется в атрибутах onclick.

Heretic Monkey 16.11.2020 23:05

Самый простой (на мой взгляд):

onclick = "javascript:{this.checked = this.defaultChecked;}"

@kzh: Почему бы и нет? Из предложенных решений это действительно работает. Почему вы не рекомендуете это?

Olie 14.08.2011 01:06

Не помещайте javascript: в onclick, он работает, но не делает того, что вы думаете.

kzh 15.08.2011 18:37

@kzh: Вместо того, чтобы быть самодовольным, почему бы не рассказать нам, что делает на самом деле?

Lawrence Dol 04.10.2013 01:35

@SoftwareMonkey Это ярлык. С таким же успехом мог бы поставить onclick = "fortran:doSomething()"

kzh 06.10.2013 04:42

@kzh: Спасибо. это гораздо полезнее, чем исходный комментарий.

Lawrence Dol 07.10.2013 03:42

Основная причина, по которой люди хотели бы установить флажок только для чтения и (также) радиогруппу только для чтения, заключается в том, чтобы информация, которую нельзя изменить, могла быть возвращена пользователю в той форме, в которой она была введена.

OK disabled сделает это - к сожалению, отключенные элементы управления не доступны с клавиатуры и, следовательно, не соответствуют всем законам о доступности. Это САМЫЙ БОЛЬШОЙ провал в HTML, о котором я знаю.

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

В старом HTML вы можете использовать

<input type = "checkbox" disabled checked>text

но на самом деле не рекомендуется использовать просто старый HTML, теперь вы должны использовать XHTML.

В правильно сформированном XHTML вы должны использовать

<input type = "checkbox" disabled = "disabled" checked = "checked" />text <!-- if yu have a checked box-->
<input type = "checkbox" disabled = "disabled" />text <!-- if you have a unchecked box -->

правильно сформированный XHTML требует формы XML, поэтому следует использовать disabled = "disabled" вместо того, чтобы просто использовать disabled.

Но в этом случае он не будет отправлен в массиве POST. Иногда такое же поведение неприемлемо.

BasTaller 21.11.2011 03:15

вы можете использовать это:

<input type = "checkbox" onclick = "return false;"/>

Это работает, потому что возврат false из события щелчка останавливает продолжение цепочки выполнения.

Хорошо, у меня это сработало очень хорошо для непроверенных случаев, но почему переход на ..."return true"... не работает? Какой для этого синтаксис? (+1 за половину ответа, в любом случае :)

Olie 14.08.2011 00:40

Возврат false в javascript предотвращает продолжение цепочки выполнения для обработчика щелчка или ключа. Не имеет ничего общего с состоянием флажка

Jessica Brown 20.08.2011 06:03

PS ... если вы хотите, чтобы флажок был в отмеченном состоянии, вам нужно добавить checked = "checked", а не связываться с javascript. JavaScript предназначен только для того, чтобы заставить игнорировать щелчки мыши на объекте ввода, а не устанавливать состояние флажка.

Jessica Brown 20.08.2011 06:15

В этом случае нет визуальной индикации статуса R / O.

Jesse Glick 13.03.2013 22:58

Однако предотвращает использование TAB для перехода к следующему входу.

user327961 30.04.2013 00:57

Какой цели служит onkeydown = "return false"? Выделение поля и нажатие space для переключения его состояния на самом деле запускает событие «щелчок», которое вы уже предотвратили. onkeydown только кажется предотвращает отрывание табуляции.

mpen 04.06.2013 20:57

Марк прав, пропустите нажатие клавиши, и предыдущий комментарий не является проблемой

Yablargo 02.07.2013 05:57

Отлично работает, особенно вместе с установкой флажка и метки opacity=0.5, чтобы он выглядел отключенным

Marco Prins 16.07.2014 17:25

Это именно то, что я искал, поведение «отключено / только чтение» без изменения стиля флажка.

daVe 14.09.2014 04:25

Полностью не работает, если отключен javascript!

Doin 23.06.2015 13:29

Не проверяется, но состояние модели меняется на один раз, и внутри себя изменяется значение модели.

deadManN 11.04.2016 15:44

Это отлично подходит для редактирования, когда вы не хотите, чтобы некоторые свойства редактировались, а отображались. Disabled = "disabled" заставляет вас создавать скрытый ввод при редактировании POST, где ввод имеет то же имя, что и отключенный флажок.

yardpenalty.com 08.09.2016 16:14

Лучшим решением будет <input type = "checkbox" onchange = "this.checked = this.readOnly ? !this.checked : this.checked" readonly = "readonly" />, так что readOnly может быть включен или выключен по желанию.

Patrick Denny 22.02.2017 19:39

Это сработало для меня. Теперь пытаюсь проделать то же самое с избранным.

Sam 17.09.2018 23:20

При отправке формы мы фактически передаем значение флажка, а не состояние (отмечено / не отмечено). Атрибут Readonly не позволяет нам редактировать значение, но не состояние. Если вы хотите иметь поле только для чтения, которое будет представлять значение, которое вы хотите отправить, используйте текст только для чтения.

Попробуйте сделать этот флажок доступным только для чтения и при этом запретить пользователю проверять. Это позволит вам POST значение флажка. Для этого вам необходимо выбрать состояние флажка по умолчанию как «Проверено».

<input type = "checkbox" readonly = "readonly" onclick = "this.checked =! this.checked;">

Если вам нужна вышеуказанная функциональность + вы не хотите получать данные флажка, попробуйте следующее:

<input type = "checkbox" readonly = "readonly" disabled = "disabled" onclick = "this.checked =! this.checked;">

Надеюсь, это поможет.

<input type = "checkbox" onclick = "return false" /> подойдет вам, я использую это

Следующее работает, если вы знаете, что флажок всегда установлен:

<input type = "checkbox" name = "Name" checked onchange='this.checked = true;'>

Я использовал это для достижения результатов:

<input type=checkbox onclick = "return false;" onkeydown = "return false;" />

В моем случае это работает без точки с запятой, иначе - нет.

Mwiza 14.09.2018 10:27

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

Простое отключение отключает все операторы JQuery / Return False.

Единственный вариант для флажков только для чтения - на стороне сервера.

Отобразите их, позвольте им изменить их, но не принимайте от них новые данные публикации.

Как (например) ответ Powtac использует Javascript?

Bob Kaufman 08.07.2012 21:54

Некоторые ответы здесь кажутся немного окольными, но вот небольшой прием.

<form id = "aform" name = "aform" method = "POST">
    <input name = "chkBox_1" type = "checkbox" checked value = "1" disabled = "disabled" />
    <input id = "submitBttn" type = "button" value = "Submit" onClick='return submitPage();'>
</form>​

то в jquery вы можете выбрать один из двух вариантов:

$(document).ready(function(){
    //first option, you don't need the disabled attribute, this will prevent
    //the user from changing the checkbox values
    $("input[name^='chkBox_1']").click(function(e){
        e.preventDefault();
    });

    //second option, keep the disabled attribute, and disable it upon submit
    $("#submitBttn").click(function(){
        $("input[name^='chkBox_1']").attr("disabled",false);
        $("#aform").submit();
    });

});

Взаимодействие с другими людьми

демо: http://jsfiddle.net/5WFYt/

И это не «карусель» ??

KoZm0kNoT 20.12.2014 04:48

нет, это довольно прямо .. это просто не лаконично.

sksallaj 02.01.2015 22:29

еще одно «простое решение»:

<!-- field that holds the data -->
<input type = "hidden" name = "my_name" value = "1" /> 
<!-- visual dummy for the user -->
<input type = "checkbox" name = "my_name_visual_dummy" value = "1" checked = "checked" disabled = "disabled" />

disabled = "disabled" / disabled=true

Это решает все проблемы: создает флажок только для чтения, отправляет данные POST и обеспечивает визуальную индикацию доступности только для чтения (в отличие от всех решений javascript)

Dalibor Frivaldsky 11.02.2014 20:16

вы также можете удалить атрибуты name и value из своего фиктивного окна, также могут быть удалены значения атрибутов = "checked" и = "diabled". w3.org/TR/html-markup/input.checkbox.html

Sampo Sarrala - codidact.org 04.10.2014 05:18

Самое главное, что это решение представляет собой простой старый HTML и не полагается на Javascript.

GlennG 05.10.2018 19:21

Основываясь на приведенных выше ответах, при использовании jQuery это может быть хорошим решением для всех входов:

<script>
    $(function () {
        $('.readonly input').attr('readonly', 'readonly');
        $('.readonly textarea').attr('readonly', 'readonly');
        $('.readonly input:checkbox').click(function(){return false;});
        $('.readonly input:checkbox').keydown(function () { return false; });
    });
</script>

Я использую это с Asp.Net MVC, чтобы установить некоторые элементы формы только для чтения. Вышеупомянутое работает для текста и флажков, устанавливая любой родительский контейнер как .readonly, например, в следующих сценариях:

<div class = "editor-field readonly">
    <input id = "Date" name = "Date" type = "datetime" value = "11/29/2012 4:01:06 PM" />
</div>
<fieldset class = "flags-editor readonly">
     <input checked = "checked" class = "flags-editor" id = "Flag1" name = "Flags" type = "checkbox" value = "Flag1" />
</fieldset>

Если кто-то еще использует MVC и шаблон редактора, я контролирую отображение свойства только для чтения (я использую настраиваемый атрибут для получения значения в операторе if)

@if (true)
{
    @Html.HiddenFor(m => m)
    @(ViewData.Model ? Html.Raw("Yes") : Html.Raw("No"))
} 
else
{               
    @Html.CheckBoxFor(m => m)
}

Или просто:

$('your selector').click(function(evt){evt.preventDefault()});

<input type = "radio" name = "alwaysOn" onchange = "this.checked=true" checked = "checked">
<input type = "radio" name = "alwaysOff" onchange = "this.checked=false" >

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

$(document).ready(function() {
    $(":checkbox").bind("click", false);
});

Это сделало бы флажки доступными только для чтения, что было бы полезно для показа клиенту данных только для чтения.

Вопрос требует наличия флажка только для чтения, а не отключенного. Так что это наиболее правильный ответ.

NileshChauhan 16.09.2015 18:21

<input name = "testName" type = "checkbox" disabled>

ОП не хотел использовать "отключен"

Reporter 27.05.2014 13:21

этот ввод не будет включен в данные формы

Peter 20.07.2016 17:14

Почему бы не закрыть ввод сверху пустым div?

<div id='checkbox_wrap'>
   <div class='click_block'></div>
   <input type='checkbox' /> 
</div>

тогда что-то вроде этого с помощью CSS

 #checkbox_wrap{
   height:10px;
   width:10px;
   }
 .click_block{
   height: 10px;
   width: 10px;
   position: absolute;
   z-index: 100;
}

это неуместно, трудно поддерживать. disabled = "disabled" - чистое решение

mPrinC 10.09.2014 21:45

Очень поздно на вечеринку, но я нашел ответ для MVC (5) Я отключил CheckBox и добавил HiddenFor ПЕРЕД флажком, поэтому, когда он публикует, сначала находит поле Hidden и использует это значение. Это действительно работает.

 <div class = "form-group">
     @Html.LabelFor(model => model.Carrier.Exists, new { @class = "control-label col-md-2" })
         <div class = "col-md-10">
              @Html.HiddenFor(model => model.Carrier.Exists)
              @Html.CheckBoxFor(model => model.Carrier.Exists, new { @disabled = "disabled" })
              @Html.ValidationMessageFor(model => model.Carrier.Exists)
          </div>
 </div>

Я бы прокомментировал ответ ConroyP, но для этого требуется 50 репутации, которой у меня нет. У меня достаточно репутации, чтобы опубликовать еще один ответ. Извиняюсь.

Проблема с ответом ConroyP заключается в том, что флажок отображается неизменным, даже если он не отображается на странице. Хотя Electrons_Ahoy не оговаривает этого, лучшим ответом будет тот, в котором неизменяемый флажок будет выглядеть аналогично, если не так, как изменяемый флажок, как в случае, когда применяется атрибут «отключен». Решение, которое устраняет две причины, по которым Electrons_Ahoy не хочет использовать атрибут «disabled», обязательно будет недействительным, поскольку в нем используется атрибут «disabled».

Предположим, что две логические переменные, $ checked и $ disabled:

if ($checked && $disabled)
    echo '<input type = "hidden" name = "my_name" value = "1" />';
echo '<input type = "checkbox" name = "my_name" value = "1" ',
    $checked ? 'checked = "checked" ' : '',
    $disabled ? 'disabled = "disabled" ' : '', '/>';

Флажок отображается как установленный, если $ checked истинно. Флажок отображается как снятый, если $ checked имеет значение false. Пользователь может изменить состояние флажка тогда и только тогда, когда $ disabled имеет значение false. Параметр "my_name" не публикуется, когда флажок снят пользователем или нет. Параметр my_name = 1 отправляется, когда флажок установлен пользователем или нет. Я считаю, что это то, что искали Electrons_Ahoy.

Я знаю, что "отключено" - неприемлемый ответ, поскольку оператор хочет его опубликовать. Однако вам всегда придется проверять значения на стороне сервера, ДАЖЕ, если у вас установлен параметр только для чтения. Это связано с тем, что вы не можете помешать злоумышленнику публиковать значения с помощью атрибута readonly.

Я предлагаю сохранить исходное значение (на стороне сервера) и отключить его. Затем, когда они отправят форму, игнорируйте любые опубликованные значения и берите исходные значения, которые вы сохранили.

Он будет выглядеть и вести себя так, как будто это значение, доступное только для чтения. И он обрабатывает (игнорирует) сообщения злонамеренных пользователей. Вы убиваете двух зайцев одним выстрелом.

Последний jQuery имеет эту функцию

$("#txtname").prop('readonly', false);

Нет, флажки ввода не могут быть доступны только для чтения.

Но вы можете сделать их только для чтения с помощью javascript!

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

jQuery(document).on('click', function(e){
      // check for type, avoid selecting the element for performance
      if (e.target.type == 'checkbox') {
          var el = jQuery(e.target);
          if (el.prop('readonly')) {
              // prevent it from changing state
              e.preventDefault();
          }
      }
});
input[type=checkbox][readonly] {
    cursor: not-allowed;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label><input type = "checkbox" checked readonly> I'm readonly!</label>

Вы можете добавить этот сценарий в любое время после загрузки jQuery.

Это будет работать для динамически добавляемых элементов.

Он работает, выбирая событие щелчка (которое происходит перед событием изменения) для любого элемента на странице, затем проверяет, является ли этот элемент флажком только для чтения, и если это так, то блокирует изменение.

Есть так много «если», чтобы это не повлияло на производительность страницы.

Просто используйте простой отключенный тег, как показано ниже.

<input type = "checkbox" name = "email"  disabled>

«Отключенный тег» не отправит эти данные

Przemysław Kaczmarczyk 02.05.2019 10:37

Если вы хотите, чтобы ВСЕ ваши флажки были «заблокированы», чтобы пользователь не мог изменить состояние «отмечен», если присутствует атрибут «только для чтения», вы можете использовать jQuery:

$(':checkbox').click(function () {
    if (typeof ($(this).attr('readonly')) != "undefined") {
        return false;
    }
});

В этом коде замечательно то, что он позволяет вам изменять атрибут «только для чтения» во всем коде без необходимости повторной привязки каждого флажка.

Это также работает для радиокнопок.

Если вы хотите, чтобы они отправлялись на сервер с формой, но не были интерактивными для пользователя, вы можете использовать pointer-events: none в css (работает во всех современных браузерах, кроме IE10- и Opera 12-) и установить для tab-index значение -1, чтобы предотвратить изменение с клавиатуры. Также обратите внимание, что вы не можете использовать тег label, поскольку щелчок по нему все равно изменит состояние.

input[type = "checkbox"][readonly] {
  pointer-events: none !important;
}

td {
  min-width: 5em;
  text-align: center;
}

td:last-child {
  text-align: left;
}
<table>
  <tr>
    <th>usual
    <th>readonly
    <th>disabled
  </tr><tr>
    <td><input type=checkbox />
    <td><input type=checkbox readonly tabindex=-1 />
    <td><input type=checkbox disabled />
    <td>works
  </tr><tr>
    <td><input type=checkbox checked />
    <td><input type=checkbox readonly checked tabindex=-1 />
    <td><input type=checkbox disabled checked />
    <td>also works
  </tr><tr>
    <td><label><input type=checkbox checked /></label>
    <td><label><input type=checkbox readonly checked tabindex=-1 /></label>
    <td><label><input type=checkbox disabled checked /></label>
    <td>broken - don't use label tag
  </tr>
</table>

Позвольте мне повторить ваше последнее предложение (я пропустил его и зря потратил драгоценное время): ваш метод бесполезен, если есть <label> (в Firefox он работает отлично. Проблема в Chrome).

Niccolo M. 19.03.2019 08:17

@NiccoloM., Но если вы знаете, что он предназначен только для чтения, зачем оборачивать его в ярлык? Также вы можете поставить после него метку и использовать атрибут for. В этом случае вы можете использовать input[type = "checkbox"][readonly] + label { pointer-events: none !important; }.

Qwertiy 19.03.2019 10:29

@KevinBui, вы удалили label и добавили tabindex? Как вы установите фокус на нефокусируемом элементе, чтобы надавить на него пробелом?

Qwertiy 21.11.2019 11:32

Я бы использовал атрибут readonly

<input type = "checkbox" readonly>

Затем используйте CSS, чтобы отключить взаимодействия:

input[type='checkbox'][readonly]{
    pointer-events: none;
}

Обратите внимание, что использование псевдокласса: только для чтения здесь не работает.

input[type='checkbox']:read-only{ /*not working*/
    pointer-events: none;
}

Запоздалый ответ, но большинство ответов, кажется, слишком усложняют его.

Насколько я понимаю, OP в основном хотел:

  1. Флажок только для чтения для отображения статуса.
  2. Значение, возвращенное с формой.

Следует отметить, что:

  1. OP предпочел не использовать атрибут disabled, потому что они «хотят, чтобы отмеченные флажки были отправлены вместе с остальной частью формы».
  2. Не отмеченные флажки не отправляются вместе с формой, поскольку цитата из OP в 1. выше указывает, что они уже знали. По сути, значение флажка существует только в том случае, если он отмечен.
  3. Отключенный флажок явно указывает на то, что его нельзя изменить намеренно, поэтому пользователь вряд ли попытается его изменить.
  4. Значение флажка не ограничивается указанием его статуса, например yes или false, но может быть любым текстом.

Поэтому, поскольку атрибут readonly не работает, лучшим решением, не требующим javascript, является:

  1. Отключенный флажок без имени или значения.
  2. Если флажок должен отображаться как установленный, скрытое поле с именем и значением, хранящимся на сервере.

Итак, для установленного флажка:

<input type = "checkbox" checked = "checked" disabled = "disabled" />
<input type = "hidden" name = "fieldname" value = "fieldvalue" />

Если флажок снят:

<input type = "checkbox" disabled = "disabled" />

Основная проблема с отключенными входами, особенно с флажками, заключается в их плохой контрастности, что может быть проблемой для некоторых с определенными нарушениями зрения. Может быть лучше указать значение простыми словами, такими как Status: none или Status: implemented, но включая скрытый ввод выше, когда последний используется, например:

<p>Status: Implemented<input type = "hidden" name = "status" value = "implemented" /></p>

В большинстве текущих ответов есть одна или несколько из этих проблем:

  1. Проверяйте только мышь, а не клавиатуру.
  2. Проверять только при загрузке страницы.
  3. Подключите постоянно популярные события change или submit, которые не всегда срабатывают, если их зацепило что-то еще.
  4. Требовать скрытый ввод или другие специальные элементы / атрибуты, которые необходимо отменить, чтобы снова включить флажок с помощью javascript.

Следующее просто и не имеет ни одной из этих проблем.

$('input[type = "checkbox"]').on('click keyup keypress keydown', function (event) {
    if ($(this).is('[readonly]')) { return false; }
});

Если флажок установлен только для чтения, он не изменится. Если нет, то будет. Он использует jquery, но вы, вероятно, уже используете это ...

Оно работает.

Это предотвращает перемещение клавиши Tab с элемента, когда он находится в фокусе.

Heretic Monkey 16.11.2020 23:04

Этот ответ не только не предлагает нового подхода, он фактически дезинформирует читателя! Пункт 3 Hook the ever-popular change or submit events which won't always work out if something else has them hooked. явно неверен и, вероятно, является признаком плохого кода. Кроме того, change (возможно, не submit) должен быть идеальным способом обработки события изменения, а не злоупотребления событиями click и key*.

bPratik 05.02.2021 14:42

@ (Model.IsEnabled) Используйте это условие для динамической проверки и снятия флажка и установки только для чтения, если флажок уже установлен.

 <input id = "abc" name = "abc"  type = "checkbox" @(Model.IsEnabled ? "checked=checked onclick=this.checked=!this.checked;" : string.Empty) >

Вы используете объект Model, не объясняя, где он определен. Кроме того, ответ не решает проблему и не дает ничего отличного от предыдущих сообщений. Я предлагаю улучшить качество и содержание этого ответа и сделать его более ценным.

bPratik 05.02.2021 14:35

Другие вопросы по теме