简短版本
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
长版本
当T.J. Crowder成功指出反射属性后,我意识到以下语法是错误的:
element.attributes["name"] = value
element.attributes.name = value
value = element.attributes.name
value = element.attributes["name"]
你必须使用
element.getAttribute
和
element.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
这就是为什么:
getAttribute(name)
setAttribute(name, value)
存在的原因。它们在内部对HtmlAttribute对象赋值起到了作用。
此外,一些属性是
反射的。这意味着你可以更方便地从Javascript中访问它们:
element.required = true;
if (element.required) {...}
element.required = false;
你不想做的是错误地使用.attributes集合:
element.attributes.required = true
if (element.attributes.required) {...} //WRONG!
element.attributes.required = false
测试案例
这导致了对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?
设置属性 required
的正确方式是什么?您有两种选择,要么使用反射的 属性,要么通过正确设置属性:
element.setAttribute("required", ""); //Correct
element.required = true; //Correct
严格来说,任何其他值都会“设置”属性。但是布尔属性的定义规定它只能被设置为空字符串""来表示true。以下方法都可以用来设置required布尔属性,
但请不要使用它们:
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")
edName.required = false
以无效的方式:
edName.setAttribute("required", null);
edName.setAttribute("required", "");
edName.setAttribute("required", "false");
edName.setAttribute("required", false);
edName.setAttribute("required", 0);
使用反射的.required属性时,您还可以使用任何“假值”来关闭它,并使用真值来打开它。但为了清晰起见,请只使用true和false。
如何检查required?
通过.hasAttribute("required")方法检查属性是否存在:
if (edName.hasAttribute("required"))
{
}
你还可以通过
布尔反射的
.required
属性进行检查。
if (edName.required)
{
}
required="false"
,在编写标准之前,他们有没有编写过模板?条件属性通常很麻烦,将布尔值放入属性值中要容易得多... - Christophe Roussy