Javascript 为什么同一输入字段文本中的“readonly”、“disabled”和“required”不能正常工作?

Javascript 为什么同一输入字段文本中的“readonly”、“disabled”和“required”不能正常工作?,javascript,jquery,html,forms,Javascript,Jquery,Html,Forms,我正在使用输入文本字段的readonly、disabled和required属性,如下所示: <input type="text" id="visitDate" name="visitdate" readonly="readonly" disabled="disabled" required="required" /> 我的问题是三个属性中的两个,即禁用和只读

我正在使用输入文本字段的
readonly
disabled
required
属性,如下所示:

<input type="text" id="visitDate" name="visitdate" readonly="readonly" disabled="disabled" required="required" />

我的问题是三个属性中的两个,即
禁用
只读
工作正常,但
必需
不工作。提交按钮允许提交,即使它是空的。但如果我删除了
只读
,表单就不能空提交

我用

只读,因为我使用的是日期选择器,不允许用户 输入日期手册

已禁用,因为我希望在开始时禁用此输入字段

必需,因为用户必须从日期选择器中选择日期,以便 不会是空的


实际情况是,默认情况下(验证的HTML实现),如果字段为只读或禁用,HTML中的验证将不会触发

原因很简单。如果该字段为空且属性已禁用或只读,并且应用了所需的验证,则该表单在任何时候都可能无效

似乎没有直接的道德解决方案,但间接的解决方案可能是:

i) 处理向上键/向下键事件,以便无法添加输入

jQuery代码:

$('input').keypress(function(e) {
    e.preventDefault();
});
ii)对于禁用控制,我建议在需要之前不要将日期选择器添加到元素中。稍后,您可以在需要时使用JS添加它(在您的示例中,在SelectListChanged事件上注册datepicker)

此外,如果使用jQuery UI日期选择器,则可以使用启用和禁用jQuery事件,如下所示:

$("#txtSearch").datepicker("enable");
$("#txtSearch").datepicker("disable");
为了进一步阅读,您可以查看链接。这是一个关于引导验证的讨论,但它也适用于纯HTML


希望,这会有所帮助。

如果元素被禁用,则在表单验证中会忽略该元素

来自HTML的WHATWG规范:

如果元素被禁用,则禁止其进行约束验证

在这里,您几乎肯定不希望禁用
功能:您想要的是
只读的行为。从记录该属性的部分:

disabled
readonly
之间的区别在于,只读控件仍然可以工作,而禁用的控件通常在启用之前不作为控件工作


“仍在运行”包括验证,以及在提交表单时作为发送数据一部分的值。

为了澄清,预期的行为是表单无法发送,因为存在无法填充的必填字段?如果禁用某个字段,则其将不会提交该字段,这就是为什么必填字段不起作用。使用只读和必需。@AmanRawat我已经提到“在开始时禁用”,但不是在提交表单之前。在提交表单之前,稍后将启用输入。@阿尔瓦罗冈萨雷斯对不起,我找不到您。我不理解“无法填充”。实际情况是,默认情况下,如果字段为只读或禁用,HTML中的验证将不会启动。原因很简单,如果字段为空且属性为禁用或只读,并且应用了所需的验证,则表单在任何时候都可能无效。因此,解决方案可能类似于处理keyup/keydown事件,这样就无法添加输入,对于disable特性,我建议在需要之前不要将日期选择器添加到元素中。希望这会有所帮助。这不是一个正确的方法,但它可以正常工作。如果使用readonly属性,则会触发此问题。接下来,我使用只读,因为用户必须从日期选择器选择日期,而不是手动输入。我只有一个选项可以使用日期选择器。只读可以被手动按键事件代替。这是我能找到的唯一解决方案:OShare是代码段,我可以通过在上面添加一些JS来帮助:)对不起,代码段让问题变得更复杂。我正在进行我的项目。许多变量和方法是相互关联的。我完全同意禁用和只读之间的区别。但我需要两者,因为我有
输入,如果用户从
中选择选项,那么只有用户可以从日期选择器输入日期,也就是说,我必须确保第一个用户从
输入中选择,然后是文本输入字段。@KrityShrestha这是您必须用Javascript解决的问题,我担心,而不是HTML验证。