HTML:为啥没有本地支持来限制复选框中的状态更改而不禁用它? [复制]

Posted

技术标签:

【中文标题】HTML:为啥没有本地支持来限制复选框中的状态更改而不禁用它? [复制]【英文标题】:HTML: Why there is no native support to restrict state change in check-box without disabling it? [duplicate]HTML:为什么没有本地支持来限制复选框中的状态更改而不禁用它? [复制] 【发布时间】:2014-07-08 06:15:28 【问题描述】:

html 中,只有文本框、文本区域、密码框等文本控件具有只读属性。为什么他们不支持复选框/单选按钮?

我知道我可以通过设置 onclick="return false;" 使用脚本来实现此功能。 (我不想要任何解决方法,我只想知道不提供原生支持来实现这一点的原因)

但我的问题是,即使复选框/单选按钮接受用户输入,也不支持只读。

编辑 1: 我找到了this,但它没有回答我的问题 - 为什么没有本地方法来限制用户更改状态而不禁用它?

【问题讨论】:

使用属性disabled怎么样? @Rob,如果我在回发中禁用,它将不会被提交 我的问题是为什么不提供这个功能只是为了防止改变状态? @Chris — 问题是问为什么没有有效的原生属性,而不是替代品是什么。 disabled 属性阻止交互,包括更改状态。 readonly 属性防止更改值,但允许交互 - 例如,更改状态。选中复选框不会更改复选框的 ,它会更改状态。该值是 value 属性设置的任何值,并且从不存在用户可以编辑复选框的值的情况,例如与 textarea 不同。因此,在设计上本质上为只读的元素上实现readonly 是不合逻辑的。 【参考方案1】:

重要的是要了解 READONLY 只会阻止用户 来自改变字段的值,而不是来自与 场地。对于许多类型的字段,READONLY 是无关紧要的,因为您 通常不更改值。例如,在复选框中,您可以 检查它们的开或关(从而设置 CHECKED 状态),但你不 更改字段的值。然而,禁用实际上可以防止 你从使用该领域。

请注意,在这些示例中,您可以设置复选框,即使 它们是“只读的”:

SOURCE

EXAMPLE 来自 faqs.org

【讨论】:

【参考方案2】:

HTML 4.01 allows readonly for input 通常不受类型限制。但是,它似乎通常没有在浏览器中实现,可能是因为实现者并没有看到对它的太多需求。在 HTML5 CR 中,readonly 明确表示input type=checkbox 的 disallowed,而 HTML5 CR(或其他一些“HTML5 规范”,例如 HTML 5.1 Nightly 或 WHATWG Living HTML)通常是实施者如今用作指南的内容。

已经有人提议在 HTML5 中允许它,例如discussion 于 2011 年 5 月在 whatwg 列表中,以及浏览器错误报告(根据 HTML5 所说的内容被拒绝),但显然没有足够好的用例。尽管存在真实的用例,但它们可能过于边缘化,并且可以提出合理的替代方案,例如使用带有适当关联文本的复选框图像(根据需要选中或未选中),如果伪复选框设置为选中,携带所需信息的隐藏字段。

【讨论】:

【参考方案3】:

使用 jquery 使其禁用(只读)或启用。只有文本字段才能使它们在呈现时可读。

<input type="checkbox" id="chk1"/>

然后使用 Jquery

$(document).ready(function()
$("#chk1").prop('disabled',true);
);

【讨论】:

问题是问为什么该功能不是原生的,它不是在寻找解决方法(它甚至在问题本身中提到了解决方法!)。跨度> 你不必经历这个...... 会工作..顺便说一句你在选择器中缺少# @Pawal 是的,我更新了我的答案。 @azhar,即使我使用一些脚本也实现了这个功能。但我只是想知道为什么没有实现这个功能,为什么他们不设计它只是为了防止用户改变状态? @krishna 实际上文本字段是只读属性,因为我们通过将其设为只读来限制用户输入任何文本,以防复选框和单选按钮没有通过键盘或任何来源添加文本。如果您考虑读/写这些属性与任何类型的文件相关联,并且文件包含一些文本(以字符的形式),而文本框 textarea 也包含文本(以字符的形式),这就是它们具有只读属性的原因。 【参考方案4】:

首先,您不应该仅仅为了检查它是否被选中而与复选框的onclick 事件相交。您应该改用onchange 事件。为什么?因为onclick 事件在onchange 事件之前触发,所以如果你与onclick 事件相交,你将无法获得复选框的实际状态,除非你用setTimeout 做一些丑陋的javascript 杂技

如果您想将复选框设为“只读”,您必须使用disabled 属性。如下图...

<input type="checkbox" disabled/>

要回答您的问题,我认为HTML Specs in W3.Org 更好地解释

disabled 和 readonly 之间的区别在于只读控件仍然是可聚焦的,因此用户仍然可以选择文本并与之交互,而 disabled 控件则完全是非交互的。 (因此,只能将文本控件设为只读:例如,复选框或按钮没有意义。)

【讨论】:

我知道你提到的区别,但他们为什么不设计它只是为了防止用户改变状态? 我不是 WWW3 标准的倡导者,我什至没有参与这些标准的设计,所以我无法告诉你为什么或如何在头脑风暴时得出这个结论/结果规格。解释对我来说似乎很清楚...禁用=没有交互...而只读=交互但不要更改。如果您真的了解其中的区别,您就不会问自己为什么

以上是关于HTML:为啥没有本地支持来限制复选框中的状态更改而不禁用它? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的复选框更改事件没有被触发?

表值在反应中没有变化

为啥即使我没有将 vuex 状态绑定到任何 html 输入元素,我的 vuex 状态也会在更改组件级别状态时发生变化?

C# 侦听 groupbox 中的复选框更改

如何更改 localStorage 项目中的单个值?

引导复选框中的 Onchange 事件