Я думал, что они могут быть, но поскольку я не вкладываю свои деньги туда, где был (так сказать), установка атрибута readonly на самом деле ничего не делает.
Я бы предпочел не использовать Disabled, так как я хочу, чтобы отмеченные флажки были отправлены вместе с остальной частью формы, я просто не хочу, чтобы клиент мог их изменить при определенных обстоятельствах.
@knittl Но у обычного посетителя нет (вредоносного) клиента. А нормальный Вистор не хотел менять информацию (в этом смысл readonly)
@ChristianGollhardt: но тогда вам не нужно отправлять значение флажка с запросом, поскольку они всегда должны быть начальным значением.
@knittl Вы, кажется, полностью игнорируете readonly! Зачем тогда мог бы существовать этот атрибут!
@IzharAazmi: readonly - это только атрибут на стороне клиента, который помогает браузеру правильно отображать сайт и затем создавать из него правильный запрос. Сервер не может и не должен знать об атрибуте readonly отображаемой страницы. Он должен предполагать, что запрос пришел откуда угодно (и, возможно, со злым умыслом); никогда не полагайтесь на вводимые пользователем данные. Тем не менее, зачем отправлять значение флажка, которое вы не можете редактировать в запросе (если вы устанавливаете значение перед рендерингом, вы уже знаете значение при отправке запроса, поэтому нет необходимости передавать его в запросе)
@knittl Согласен! Но вы видите, что атрибут readonly по какой-то причине существует. Это, конечно, не имеет ничего общего с реализацией на стороне сервера. Но он там, чтобы сказать пользователю: «Эй! Это значение предполагается здесь, и / но вы не можете его изменить».
@IzharAazmi, он просто напомнил тебе. Я обошел многие вещи, отредактировав только чтение / отключено или добавив пользовательские значения в <select>
дубликат stackoverflow.com/questions/12267242/…
@knittl, галочка принимать лицензионное соглашение при регистрации на сайте. Если вы не отправляете его, пользователь может сказать «эй, я не принял его», если вы отправите его, вы можете проверить, что он был проверен. Но нет смысла отправлять форму со снятым флажком. Похоже, в таком случае вас может заинтересовать состояние только для чтения. Именно туда его нужно отправить и проверить.
Поскольку я не часто имею дело с флажками, я забываю об этом беспорядке и делаю ошибку. Мне пришлось поместить предупреждение в свой основной файл js, чтобы напомнить мне, если я случайно сделаю «только для чтения» на одном из них. Вот он: ** let cbox = $ ("input: checkbox"); if ($ (cbox) .prop ('readonly')) {alert ("Флажок НЕ МОЖЕТ иметь свойство только для чтения. Исправьте!")}; **
@knittl Можно просто изменить его на «зачем отправлять НИЧЕГО, что вы не можете редактировать». Давайте забудем об отправке любых данных статической формы, потому что мы всегда можем написать тонну странного кода, чтобы сообщить серверу: «Я не получил это поле, поэтому я должен повторно запросить свою базу данных, чтобы получить фактическое значение, когда я выполняю динамические обновления. ". Серьезно, это именно то, что есть - кто-то решил не устанавливать флажок «только для чтения» по причинам, которые ускользают от меня и большинства людей. Возможно, это связано с пивом или травяными добавками. Мне это не нравится, потому что это сбивает с толку. Здесь идет обсуждение WC3: github.com/w3c/html/issues/92
(@) Квиртий. Чтобы сделать выбор однозначным, лучше всего принудительно выбрать его с помощью переключателей. Однако лучше всего было бы принудительно принять явное решение, выполнив следующие действия: 1. Первоначально не отмечая кнопки. 2. Если опция не была выбрана при отправке, код сервера может повторно представить страницу.






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';
}
Работает, но это вроде .. ну грязно, только для чтения на флажках должно просто делать то, что подсказывает интуиция.
Интуиция обманывает нас, как объяснил ConroyP.
Интуиция не обманула нас, она обманула тех, кто так реализовал чекбокс.
@ConroyP -> "он не позволяет вам редактировать значение поля, но с помощью флажка вы фактически редактируете состояние поля (включено || выключено)". Это действительно слабое оправдание тупого решения. «Состояние» и «значение» для большинства из нас во многом такие же, как «toMAYto» и «toMAHto», как вы можете видеть по голосам тех, кто не согласен.
Нет, но вы можете использовать события javascript для достижения чего-то подобного.
I just don't want the client to be able to change them under certain circumstances.
READONLY сам по себе работать не будет. Вы можете сделать что-нибудь интересное с CSS, но мы обычно просто отключаем их.
ВНИМАНИЕ: если они отправлены обратно, клиент может их изменить, точка. Вы не можете полагаться только на чтение, чтобы помешать пользователю что-то изменить. Всегда можно использовать скрипач или просто передать html с firebug или что-то в этом роде.
Вы совершенно правы, поэтому я также проверяю это на стороне сервера, устанавливая это просто для улучшения взаимодействия с пользователем на стороне клиента.
Это флажок, который нельзя изменить:
<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.
@powtac Вы не указали, что он хочет, чтобы данные были опубликованы, ваш пример этого не делает.
Невозможно, чтобы этот ответ получил 105 голосов. Это идет вразрез со всем, что говорится в ОП.
Почему за этот ответ так много голосов? в вопросе четко сказано, что инвалид не служит цели!
@AkshaySinghal, потому что он служит цели для других людей, которые не являются оператором!
@nathanhayfield: по этой логике я смогу публиковать полезные ответы на тему Любые и получать голоса за. :(
@MichaelBray Я предполагаю, что это набирает много голосов, потому что многие люди хотят знать, как сделать флажки доступными только для чтения, поэтому они делают следующее: 1) Google «Флажок только для чтения». 2) Убедитесь, что заголовок этого вопроса соответствует тому, что они хотят сделать, и щелкните по нему. 3) Прокрутите вниз, пока не найдете этот ответ. 4) Счастья и поддержки.
Это искажает значение - всегда отправляет ЛОЖЬ
Согласившись с @ JM4, этот ответ полностью противоречит вопросу. Может все еще быть полезным, но - проголосовали против: - /
@ JM4 Да, за него следует проголосовать против, и я использую в нем свой первый голос против! :) (и я не теряю репутацию ?! Думаю, я не могу проиграть меньше 125).
Предположительно, вы можете просто добавить скрытый ввод (со значением «off» и тем же именем, что и флажок) прямо перед флажком, и он будет отправлен, когда флажок не установлен. Никакого JavaScript, просто использование того факта, что будет отправлено последнее поле с определенным значением имени. Он фактически дает вам флажок, который отправляет значение, когда он не установлен. Что такое хакерский HTML.
Дополнительное примечание, просто чтобы сообщить об этом где-нибудь: также кажется, что (по крайней мере, в Chrome), когда флажок отключен, вы не можете сфокусировать его (это нормально), но вы даже не можете сфокусировать его соответствующий label, даже добавив к нему tabindex = "0" !! (это не нормально)
Я хотел бы добавить, что создание скрытого поля, позволяющего передавать значение, может нарушить любую проверку или другие ожидания сценариев. Если вы ожидаете группу флажков и взаимодействуете с ними (ищите их состояние / значение и т. д.), Просмотр СКРЫТОГО поля с тем же именем, что и флажки, означает, что данные / параметры этого элемента управления должны обрабатываться независимо от флажки.
Он получил от меня положительный голос, потому что он подходит для того, для чего мне это нужно - я использую флажок как состояние на странице, обращенной к пользователю, но значение (если оно не только для чтения) в любом случае уже помещается в другое поле , поэтому меня не волнует значение самого поля флажка. :)
Иногда вам не важны значения формы, например, если флажки поддерживаются объектом reactive, и вы не собираетесь отправлять какую-либо форму, используя данные формы, а скорее реактивный объект.
@GaryRichter. На самом деле атрибут name для флажка не требуется. А поскольку снятый флажок вообще не публикуется, скрытый ввод следует использовать только тогда, когда этот флажок установлен. Также значением флажка может быть любой текст. Смотрите мой ответ для полного подхода, без вводящих в заблуждение придатков!
@Patanjali правильно, атрибут имени не требуется. Но OP первоначально спросил, можно ли установить для них значение READONLY (что не является допустимым атрибутом флажка), и упомянул, что они действительно хотят, чтобы флажок был представлен в форме (что означает, что у него должно быть имя). Реализация скрытого поля может быть немного взломана, особенно если пользователь взаимодействует со списком флажков, а не только с одним элементом управления. Я хотел сказать, что этот ответ может работать в очень узком масштабе и создаст другие проблемы, которые необходимо учитывать в зависимости от реализации.
Это представляет собой небольшую проблему с удобством использования.
Если вы хотите отобразить флажок, но не позволять ему взаимодействовать, зачем тогда вообще флажок?
Однако мой подход заключался бы в использовании отключенного (пользователь ожидает, что отключенный флажок будет недоступен для редактирования, вместо того, чтобы использовать 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;
}
}
}
Другой вариант - отобразить отключенный флажок (или изображение или что-нибудь для обозначения отмеченного / снятого флажка) и иметь скрытый ввод, который обрабатывается сервером.
Это не проблема удобства использования, когда у вас есть форма, в которой часть вашего решения влияет на некоторые другие входные данные (также как: установка значения, которое нельзя коснуться, если вы не отмените свое первое действие). Ненавижу, когда люди пытаются изменить мнение людей вместо ответа (это не о тебе, @FlySwat, ты ответил).
Цель состоит в том, чтобы использовать флажок в качестве поля отображения «это значение истинно», которое легче просмотреть по таблице, чем связку «истина» / «ложь». Конечно, вы можете использовать значок, но в форме флажки кажутся готовыми для использования.
@FlySwat: +1 для меня это лучшее решение, и его также можно использовать для списка <SELECT> и других типов полей <INPUT>, см. Здесь: stackoverflow.com/q/1191113/260080
Я обычно использую это решение, но ... иногда пользователи, особенно при медленном соединении, видят, что кнопки ввода включены после отправки формы, и решают поиграть с ними.
+2 для части "почему бы не использовать", -1 для части кода = +1
Предположим, у вас есть ряд «функций», которые могут быть включены или нет, поэтому у вас есть шаблон с флажком для функции. Но иногда функция является предпосылкой для чего-то еще ... поэтому она ДОЛЖНА быть включена, но вы не хотите изменять свой шаблон. Именно для этого нужен флажок отключен / установлен. Они существуют всегда, так что я надеюсь, что вопрос «зачем вообще галочка» был риторическим.
Функция флажка существовала еще до появления программирования (ее можно было увидеть на каждой блок-схеме процесса, связанной с принятием решений), и тем более до появления интерфейса на основе Windows три десятилетия назад. И они оказались визуальным эликсиром, почти неотъемлемой частью программирования графического интерфейса. Если я хочу сообщить пользователю, что определенная цена была доступна в течение предыдущего периода, но недоступна сейчас, что может быть лучше, чем отображать отключенный флажок "установлен"?
Вы всегда можете использовать небольшое изображение, похожее на флажок.
Сложность использования изображения флажка заключается в том, что сам флажок отображается браузером. Некоторые браузеры просто используют собственные элементы управления из ОС, но другие рисуют свои собственные стильные элементы управления. Таким образом, изображение вашего флажка не будет выглядеть так же, как другие флажки на странице в некоторых браузерах. Конечно, вы можете заменить все флажки на странице своим стилем ...
Признаюсь, это не худший ответ. Прошло 7 лет, а в HTML до сих пор нет простого и понятного способа сделать флажки «только для чтения». Вместо того, чтобы помещать тонны javascript, который в любом случае будет отключен noscript, и создавать фальшивые скрытые флажки, вы можете просто удалить этот флажок и поместить изображение или текст, указывающий, что выбора нет. Мне также интересно, увижу ли я какой-нибудь идеальный ответ на этот вопрос, прежде чем умру от старости или нет.
<input type = "checkbox" onclick = "this.checked=!this.checked;">
Но вы ОБЯЗАТЕЛЬНО ДОЛЖНЫ проверить данные на сервере, чтобы убедиться, что они не были изменены.
Я нашел это лучшим решением; Кроме того, я могу вызвать другой фрагмент кода (скажем, какой-нибудь jquery-материал), чтобы отобразить симпатичный маленький знак, который говорит: «Вы не можете изменить это, пока сначала не выполните x». Что-то вроде: "... onclick = 'this.checked =! This.checked; javascript: theCheckboxWasClicked ();' ..."
Это не серые поля, как в случае с ответом от powtac, поэтому он получил мой голос
Это немного хакерский, но гениальный, идеальный, почти элегантный хакер.
Лучшее решение. Должен быть отмечен как правильный ответ.
Как указано выше, это не работает при двойном щелчке в IE. Я использовал: onchange = "this.checked = true;"
Почему у вас this.checked=!this.checked? Разве нельзя просто false? Кроме того, я почти уверен, что точка с запятой не нужна
При отправке флажка 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.
Не отмеченный флажок игнорируется при публикации формы владения. Нет никакой переменной, не говоря уже о значении.
<input name = "isActive" id = "isActive" type = "checkbox" value = "1" checked = "checked" onclick = "return false"/>
Если вам нужно, чтобы флажок был отправлен вместе с формой, но фактически доступен только для чтения пользователю, я рекомендую отключить их и использовать javascript, чтобы повторно включить их при отправке формы.
Это по двум причинам. Во-первых, что наиболее важно, вашим пользователям будет выгодно видеть видимую разницу между флажками, которые они могут изменять, и флажками, доступными только для чтения. Disabled делает это.
Вторая причина заключается в том, что отключенное состояние встроено в браузер, поэтому вам нужно меньше кода для выполнения, когда пользователь что-то нажимает. Вероятно, это больше личное предпочтение, чем что-либо еще. Вам все равно понадобится JavaScript, чтобы отключить их при отправке формы.
Мне кажется проще использовать какой-нибудь javascript при отправке формы, чтобы отключить флажки, чем использовать скрытый ввод для переноса значения.
Не приведет ли это к тому, что они ненадолго перейдут во включенное состояние при отправке формы?
Мое решение на самом деле противоположно решению 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.
Я использовал data-readonly = true вместо стандартного атрибута, и он отлично работает во всех браузерах. Мне это решение нравится больше, чем другие, перечисленные выше +1
Селектор должен быть $(':checkbox[readonly]') для выбора всех возможных флажков, поскольку значение атрибута readonly является необязательным.
onclick = "javascript: return false;"
Хммм ... это работает для случая false / unchecked, но onclick = "javascript: return true;" просто заставляет его действовать как обычный флажок. Подсказки? Спасибо!
@Olie, добавьте атрибут checked и оставьте false на месте.
Схема javascript: не требуется в атрибутах onclick.
Самый простой (на мой взгляд):
onclick = "javascript:{this.checked = this.defaultChecked;}"
@kzh: Почему бы и нет? Из предложенных решений это действительно работает. Почему вы не рекомендуете это?
Не помещайте javascript: в onclick, он работает, но не делает того, что вы думаете.
@kzh: Вместо того, чтобы быть самодовольным, почему бы не рассказать нам, что делает на самом деле?
@SoftwareMonkey Это ярлык. С таким же успехом мог бы поставить onclick = "fortran:doSomething()"
@kzh: Спасибо. это гораздо полезнее, чем исходный комментарий.
Основная причина, по которой люди хотели бы установить флажок только для чтения и (также) радиогруппу только для чтения, заключается в том, чтобы информация, которую нельзя изменить, могла быть возвращена пользователю в той форме, в которой она была введена.
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. Иногда такое же поведение неприемлемо.
вы можете использовать это:
<input type = "checkbox" onclick = "return false;"/>
Это работает, потому что возврат false из события щелчка останавливает продолжение цепочки выполнения.
Хорошо, у меня это сработало очень хорошо для непроверенных случаев, но почему переход на ..."return true"... не работает? Какой для этого синтаксис? (+1 за половину ответа, в любом случае :)
Возврат false в javascript предотвращает продолжение цепочки выполнения для обработчика щелчка или ключа. Не имеет ничего общего с состоянием флажка
PS ... если вы хотите, чтобы флажок был в отмеченном состоянии, вам нужно добавить checked = "checked", а не связываться с javascript. JavaScript предназначен только для того, чтобы заставить игнорировать щелчки мыши на объекте ввода, а не устанавливать состояние флажка.
В этом случае нет визуальной индикации статуса R / O.
Однако предотвращает использование TAB для перехода к следующему входу.
Какой цели служит onkeydown = "return false"? Выделение поля и нажатие space для переключения его состояния на самом деле запускает событие «щелчок», которое вы уже предотвратили. onkeydown только кажется предотвращает отрывание табуляции.
Марк прав, пропустите нажатие клавиши, и предыдущий комментарий не является проблемой
Отлично работает, особенно вместе с установкой флажка и метки opacity=0.5, чтобы он выглядел отключенным
Это именно то, что я искал, поведение «отключено / только чтение» без изменения стиля флажка.
Полностью не работает, если отключен javascript!
Не проверяется, но состояние модели меняется на один раз, и внутри себя изменяется значение модели.
Это отлично подходит для редактирования, когда вы не хотите, чтобы некоторые свойства редактировались, а отображались. Disabled = "disabled" заставляет вас создавать скрытый ввод при редактировании POST, где ввод имеет то же имя, что и отключенный флажок.
Лучшим решением будет <input type = "checkbox" onchange = "this.checked = this.readOnly ? !this.checked : this.checked" readonly = "readonly" />, так что readOnly может быть включен или выключен по желанию.
Это сработало для меня. Теперь пытаюсь проделать то же самое с избранным.
При отправке формы мы фактически передаем значение флажка, а не состояние (отмечено / не отмечено). Атрибут 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;" />
В моем случае это работает без точки с запятой, иначе - нет.
Никто из вас здесь не думает, что все вы используете JavaScript, который может быть легко обойден любым пользователем.
Простое отключение отключает все операторы JQuery / Return False.
Единственный вариант для флажков только для чтения - на стороне сервера.
Отобразите их, позвольте им изменить их, но не принимайте от них новые данные публикации.
Как (например) ответ Powtac использует Javascript?
Некоторые ответы здесь кажутся немного окольными, но вот небольшой прием.
<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/
И это не «карусель» ??
нет, это довольно прямо .. это просто не лаконично.
еще одно «простое решение»:
<!-- 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)
вы также можете удалить атрибуты name и value из своего фиктивного окна, также могут быть удалены значения атрибутов = "checked" и = "diabled". w3.org/TR/html-markup/input.checkbox.html
Самое главное, что это решение представляет собой простой старый HTML и не полагается на Javascript.
Основываясь на приведенных выше ответах, при использовании 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);
});
Это сделало бы флажки доступными только для чтения, что было бы полезно для показа клиенту данных только для чтения.
Вопрос требует наличия флажка только для чтения, а не отключенного. Так что это наиболее правильный ответ.
<input name = "testName" type = "checkbox" disabled>
ОП не хотел использовать "отключен"
этот ввод не будет включен в данные формы
Почему бы не закрыть ввод сверху пустым 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" - чистое решение
Очень поздно на вечеринку, но я нашел ответ для 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>
«Отключенный тег» не отправит эти данные
Если вы хотите, чтобы ВСЕ ваши флажки были «заблокированы», чтобы пользователь не мог изменить состояние «отмечен», если присутствует атрибут «только для чтения», вы можете использовать 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).
@NiccoloM., Но если вы знаете, что он предназначен только для чтения, зачем оборачивать его в ярлык? Также вы можете поставить после него метку и использовать атрибут for. В этом случае вы можете использовать input[type = "checkbox"][readonly] + label { pointer-events: none !important; }.
@KevinBui, вы удалили label и добавили tabindex? Как вы установите фокус на нефокусируемом элементе, чтобы надавить на него пробелом?
Я бы использовал атрибут readonly
<input type = "checkbox" readonly>
Затем используйте CSS, чтобы отключить взаимодействия:
input[type='checkbox'][readonly]{
pointer-events: none;
}
Обратите внимание, что использование псевдокласса: только для чтения здесь не работает.
input[type='checkbox']:read-only{ /*not working*/
pointer-events: none;
}
Запоздалый ответ, но большинство ответов, кажется, слишком усложняют его.
Насколько я понимаю, OP в основном хотел:
Следует отметить, что:
disabled, потому что они «хотят, чтобы отмеченные флажки были отправлены вместе с остальной частью формы».yes или false, но может быть любым текстом.Поэтому, поскольку атрибут readonly не работает, лучшим решением, не требующим javascript, является:
Итак, для установленного флажка:
<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>В большинстве текущих ответов есть одна или несколько из этих проблем:
Следующее просто и не имеет ни одной из этих проблем.
$('input[type = "checkbox"]').on('click keyup keypress keydown', function (event) {
if ($(this).is('[readonly]')) { return false; }
});
Если флажок установлен только для чтения, он не изменится. Если нет, то будет. Он использует jquery, но вы, вероятно, уже используете это ...
Оно работает.
Это предотвращает перемещение клавиши Tab с элемента, когда он находится в фокусе.
Этот ответ не только не предлагает нового подхода, он фактически дезинформирует читателя! Пункт 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*.
@ (Model.IsEnabled) Используйте это условие для динамической проверки и снятия флажка и установки только для чтения, если флажок уже установлен.
<input id = "abc" name = "abc" type = "checkbox" @(Model.IsEnabled ? "checked=checked onclick=this.checked=!this.checked;" : string.Empty) >
Вы используете объект Model, не объясняя, где он определен. Кроме того, ответ не решает проблему и не дает ничего отличного от предыдущих сообщений. Я предлагаю улучшить качество и содержание этого ответа и сделать его более ценным.
(Вредоносный) клиент всегда может изменить значение флажка (или отправить произвольный запрос). Всегда проверяйте правильность проверки на стороне сервера!