ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Javascript 中设置 HTML5 必需属性?

我正在尝试在 Javascript 中将 text 输入框标记为 必需

<input id="edName" type="text" id="name">

如果该字段最初标记为 required

<form>
    <input id="edName" type="text" id="name" required><br>
    <input type="submit" value="Search">
</form>

当用户尝试提交时,他们会收到验证错误:

https://i.stack.imgur.com/R3h1L.png

但现在我想通过 Javascript 在 "runtime" 处设置 required 属性:

<form>
    <input id="edName" type="text" id="name"><br>
    <input type="submit" value="Search">
</form>

使用相应的脚本:

//recommended W3C HTML5 syntax for boolean attributes
document.getElementById("edName").attributes["required"] = "";         

除了我现在提交时,没有验证检查,没有阻止。

设置 HTML5 验证布尔属性的正确方法是什么?

jsFiddle

你问这个属性的值是多少?

HTML5 验证 required attribute is documented 作为 Boolean

4.10.7.3.4 必需属性 必需属性是布尔属性。指定时,该元素是必需的。

关于如何定义 boolean 属性有很多令人费解的地方。 HTML5 规范说明:

元素上存在布尔属性表示真值,不存在该属性表示假值。如果存在该属性,则其值必须是空字符串或与属性的规范名称匹配的不区分大小写的 ASCII 值,并且没有前导或尾随空格。

这意味着您可以通过两种不同的方式指定 required boolean 属性:

edName.attributes.required = ""; //the empty string
edName.attributes.required = "required"; //the attribute's canonical name

但是属性的真正价值是什么?

查看 my jsFiddle of this problem 时,您会注意到如果在标记中定义了 required 属性:

<input id="edName" type="text" id="name" required>

那么属性的值不是空字符串,也不是属性的规范名称:

edName.attributes.required = [object Attr]

这可能会导致解决方案。

我不明白他们为什么不允许required="false",他们是否在编写标准之前编写过模板?条件属性通常很痛苦,将布尔值放在属性值中会更容易......
是否可以在所需输入上手动显示该文本:“请填写此字段。”?

C
Community

requiredreflected property(如 idnametype 等),因此:

element.required = true;

...其中 element 是实际的 input DOM 元素,例如:

document.getElementById("edName").required = true;

(只是为了完整性。)

回覆:

那么属性的值不是空字符串,也不是属性的规范名称:edName.attributes.required = [object Attr]

那是因为该代码中的 required 是一个属性对象,而不是一个字符串; attributes 是一个 NamedNodeMap,其值为 Attr objects。要获取其中一个的值,您需要查看它的 value 属性。但是对于布尔属性,该值是不相关的;该属性要么存在于地图中(真),要么不存在(假)。

因此,如果 required 没有 反映,您可以通过添加属性来设置它:

element.setAttribute("required", "");

...相当于 element.required = true。您可以通过完全删除它来清除它:

element.removeAttribute("required");

...相当于 element.required = false

但我们不必对 required 执行此操作,因为它已被反映。


d
dgo

精简版

element.setAttribute("required", "");    //turns required on
element.required = true;                 //turns required on through reflected attribute
jQuery(element).attr('required', '');    //turns required on
$("#elementId").attr('required', '');    //turns required on

element.removeAttribute("required");     //turns required off
element.required = false;                //turns required off through reflected attribute
jQuery(element).removeAttr('required');  //turns required off
$("#elementId").removeAttr('required');  //turns required off

if (edName.hasAttribute("required")) { }  //check if required
if (edName.required) { }                 //check if required using reflected attribute

长版

一旦 TJ Crowder 设法指出 reflected properties,我就知道以下语法是错误

element.attributes["name"] = value; //bad! Overwrites the HtmlAttribute object
element.attributes.name = value;    //bad! Overwrites the HtmlAttribute object
value = element.attributes.name;    //bad! Returns the HtmlAttribute object, not its value
value = element.attributes["name"]; //bad! Returns the HtmlAttribute object, not its value

必须通过element.getAttributeelement.setAttribute

element.getAttribute("foo");         //correct
element.setAttribute("foo", "test"); //correct

这是因为该属性实际上包含一个特殊的 HtmlAttribute 对象:

element.attributes["foo"];           //returns HtmlAttribute object, not the value of the attribute
element.attributes.foo;              //returns HtmlAttribute object, not the value of the attribute

通过将属性值设置为“true”,您错误地将其设置为 String 对象,而不是它所需的 HtmlAttribute 对象:

element.attributes["foo"] = "true";  //error because "true" is not a HtmlAttribute object
element.setAttribute("foo", "true"); //error because "true" is not an HtmlAttribute object

从概念上讲,正确的想法(用类型语言表达)是:

HtmlAttribute attribute = new HtmlAttribute();
attribute.value = "";
element.attributes["required"] = attribute;

这就是为什么:

获取属性(名称)

设置属性(名称,值)

存在。他们负责将值分配给内部的 HtmlAttribute 对象。

除此之外,还反映了一些属性。这意味着您可以从 Javascript 更好地访问它们:

//Set the required attribute
//element.setAttribute("required", ""); 
element.required = true;

//Check the attribute
//if (element.getAttribute("required")) {...}
if (element.required) {...}

//Remove the required attribute
//element.removeAttribute("required");
element.required = false;

想要做的是错误地使用了 .attributes 集合:

element.attributes.required = true;     //WRONG!
if (element.attributes.required) {...}  //WRONG!
element.attributes.required = false;    //WRONG!

测试用例

这导致围绕使用 required 属性进行测试,比较通过属性返回的值和反射属性

document.getElementById("name").required;
document.getElementById("name").getAttribute("required");

结果:

HTML                         .required        .getAttribute("required")
==========================   ===============  =========================
<input>                      false (Boolean)  null (Object)
<input required>             true  (Boolean)  "" (String)
<input required="">          true  (Boolean)  "" (String)
<input required="required">  true  (Boolean)  "required" (String)
<input required="true">      true  (Boolean)  "true" (String)
<input required="false">     true  (Boolean)  "false" (String)
<input required="0">         true  (Boolean)  "0" (String)

尝试直接访问 .attributes 集合是错误的。它返回代表 DOM 属性的对象:

edName.attributes["required"] => [object Attr]
edName.attributes.required    => [object Attr]

这解释了为什么您永远不应该直接与 .attributes 集合交谈。您不是在操作属性的 ,而是在操作代表属性本身的对象。

需要怎么设置?

在属性上设置 required 的正确方法是什么?您有两个选择,要么是反射 property,要么是通过正确设置属性:

element.setAttribute("required", "");         //Correct
edName.required = true;                       //Correct

严格来说,任何其他值都会“设置”该属性。但是 Boolean 属性的定义规定它只能设置为空字符串 "" 以指示 true。以下方法都可以设置 required Boolean 属性,

但不要使用它们:

element.setAttribute("required", "required"); //valid, but not preferred
element.setAttribute("required", "foo");      //works, but silly
element.setAttribute("required", "true");     //Works, but don't do it, because:
element.setAttribute("required", "false");    //also sets required boolean to true
element.setAttribute("required", false);      //also sets required boolean to true
element.setAttribute("required", 0);          //also sets required boolean to true

我们已经知道尝试直接设置属性是错误的:

edName.attributes["required"] = true;       //wrong
edName.attributes["required"] = "";         //wrong
edName.attributes["required"] = "required"; //wrong
edName.attributes.required = true;          //wrong
edName.attributes.required = "";            //wrong
edName.attributes.required = "required";    //wrong

如何清除必填项?

尝试删除 required 属性时的技巧是很容易意外打开它:

edName.removeAttribute("required");     //Correct
edName.required = false;                //Correct

使用无效的方式:

edName.setAttribute("required", null);    //WRONG! Actually turns required on!
edName.setAttribute("required", "");      //WRONG! Actually turns required on!
edName.setAttribute("required", "false"); //WRONG! Actually turns required on!
edName.setAttribute("required", false);   //WRONG! Actually turns required on!
edName.setAttribute("required", 0);       //WRONG! Actually turns required on!

使用反射 .required 属性时,您还可以使用任何 "falsey" 值将其关闭,并使用真值将其打开。但为了清楚起见,只要坚持真假。

如何检查是否需要?

通过 .hasAttribute("required") 方法检查属性是否存在:

if (edName.hasAttribute("required"))
{
}

您还可以通过 Boolean 反映的 .required 属性检查它:

if (edName.required)
{
}

变量 elementedName 有什么区别?
一个是我忘记将特定元素名称 edName(即名称输入框)转换为通用 element
“您必须通过 element.getAttributeelement.setAttribute:” 为清楚起见,如果您知道,您可以使用 attributes NamedNodeMap 更改属性的值该属性已经存在,您不能使用它来添加不存在的属性(或删除存在的属性)。所以这种方法对于像 required 这样的布尔属性没有用,因为对它们而言重要的是它们是否存在,而不是它们的值是什么。但是,是的,反射属性通常更容易。 :-)
D
Denys Séguret

重要的不是属性而是属性,它的值是一个布尔值。

您可以使用

 document.getElementById("edName").required = true;

v
vladCovaliov

和 jquery 版本:

$('input').attr('required', true)
$('input').attr('required', false)

我知道这超出了问题的范围,但也许有人会觉得这很有帮助:)


实际上,使用 prop() 而不是 attr() :)
@PierreDuc 现在是 2019 年 .. 我们不再使用 :)
@a20 上次我检查时,我仍在使用它。所以,我猜你错了
我在开玩笑我哥哥..对不起!
K
Kyle Pennell
let formelems = document.querySelectorAll('input,textarea,select');
formelems.forEach((formelem) => {
  formelem.required = true;

});

如果您希望所有输入、文本区域和选择元素都是必需的。


V
Vijay

试试这个..

document.getElementById("edName").required = true;