w3c html5 required,html - How to set HTML5 required attribute in Javascript? - Stack Overflow

Short version

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

Long Version

Once T.J. Crowder managed to point out reflected properties, i learned that following syntax is wrong:

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

You must go through element.getAttribute and element.setAttribute:

element.getAttribute("foo"); //correct

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

This is because the attribute actually contains a special HtmlAttribute object:

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

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

By setting an attribute value to "true", you are mistakenly setting it to a String object, rather than the HtmlAttribute object it requires:

element.attributes["foo"] = "true"; //error because "true" is not a HtmlAttribute object

element.setAttribute("foo", "true"); //error because "true" is not an HtmlAttribute object

Conceptually the correct idea (expressed in a typed language), is:

HtmlAttribute attribute = new HtmlAttribute();

attribute.value = "";

element.attributes["required"] = attribute;

This is why:

getAttribute(name)

setAttribute(name, value)

exist. They do the work on assigning the value to the HtmlAttribute object inside.

On top of this, some attribute are reflected. This means that you can access them more nicely from 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;

What you don't want to do is mistakenly use the .attributes collection:

element.attributes.required = true; //WRONG!

if (element.attributes.required) {...} //WRONG!

element.attributes.required = false; //WRONG!

Testing Cases

This led to testing around the use of a required attribute, comparing the values returned through the attribute, and the reflected property

document.getElementById("name").required;

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

with results:

HTML .required .getAttribute("required")

========================== =============== =========================

false (Boolean) null (Object)

true (Boolean) "" (String)

true (Boolean) "" (String)

true (Boolean) "required" (String)

true (Boolean) "true" (String)

true (Boolean) "false" (String)

true (Boolean) "0" (String)

Trying to access the .attributes collection directly is wrong. It returns the object that represents the DOM attribute:

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

edName.attributes.required => [object Attr]

This explains why you should never talk to the .attributes collect directly. You're not manipulating the values of the attributes, but the objects that represent the attributes themselves.

How to set required?

What's the correct way to set required on an attribute? You have two choices, either the reflected property, or through correctly setting the attribute:

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

edName.required = true; //Correct

Strictly speaking, any other value will "set" the attribute. But the definition of Boolean attributes dictate that it should only be set to the empty string "" to indicate true. The following methods all work to set the required Boolean attribute,

but do not use them:

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

We already learned that trying to set the attribute directly is wrong:

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

How to clear required?

The trick when trying to remove the required attribute is that it's easy to accidentally turn it on:

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

edName.required = false; //Correct

With the invalid ways:

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!

When using the reflected .required property, you can also use any "falsey" values to turn it off, and truthy values to turn it on. But just stick to true and false for clarity.

How to check for required?

Check for the presence of the attribute through the .hasAttribute("required") method:

if (edName.hasAttribute("required"))

{

}

You can also check it through the Boolean reflected .required property:

if (edName.required)

{

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值