Как установить HTML5 обязательный атрибут в Javascript?
я пытаюсь отметить a text
поле ввода как требуются в Javascript.
<input id="edName" type="text" id="name">
если поле изначально обозначены как required
:
<form>
<input id="edName" type="text" id="name" required><br>
<input type="submit" value="Search">
</form>
когда пользователь пытается отправить им выдается ошибка проверки:
но теперь я хочу установить на "runtime", через Javascript:
<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?
каково значение атрибута, спросите вы?
проверка HTML5 документирована как Boolean
:
4.10.7.3.4 в
required
атрибутThe
required
это логический атрибут. Если этот элемент указан, он является обязательным.
есть много заламывания рук о том, как определить . Спецификация HTML5 отмечает:
наличие логического атрибута в элементе представляет истинное значение, а отсутствие атрибута представляет ложное значение.
если атрибут присутствует, его значение должно быть либо пустой строкой, либо значением, которое не зависит от регистра ASCII для канонического имени атрибута, без начальных или конечных пробелов.
это означает, что вы можете указать required
boolean атрибут двумя разными способами:
edName.attributes.required = ""; //the empty string
edName.attributes.required = "required"; //the attribute's canonical name
но каково значение атрибута действительно?
когда вы смотрите на мой jsFiddle этого проблема, вы заметите, что если required
атрибут определяется в разметке:
<input id="edName" type="text" id="name" required>
тогда значение атрибута не пустая строка, ни каноническое имя атрибута:
edName.attributes.required = [object Attr]
это может привести к решению.
5 ответов:
required
это отражено собственность (типаid
,name
,type
и такие), так:element.required = true;
...где
element
фактическийinput
элемент DOM, например:document.getElementById("edName").required = true;
(просто для полноты картины.)
Re:
тогда значение атрибута не является ни пустой строкой, ни каноническим именем атрибута:
edName.attributes.required = [object Attr]
вот так
required
в этом коде-это объект, а не строку;attributes
этоNamedNodeMap
чьи значенияAttr
объекты. Чтобы получить значение одного из них, вы бы посмотрели на егоvalue
собственность. Но для логического атрибута значение не имеет значения; атрибут либо присутствует в карте (true), либо нет (false).если
required
не отраженный, вы бы установить его, добавив атрибут:element.setAttribute("required", "");
...какой эквивалент
element.required = true
. Вы бы очистить его, удалив его полностью:element.removeAttribute("required");
...что является эквивалентом
element.required = false
.но мы не должны делать, что с
required
, так как это отражается.
короткая версия
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
Текст
однажды Ти Джей Краудеру удалось указать отражены свойства, я узнал, что следующий синтаксис неправильно:
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.getAttribute
иelement.setAttribute
:element.getAttribute("foo"); //correct element.setAttribute("foo", "test"); //correct
это потому, что атрибут на самом деле содержит специальный HtmlAttribute. Они выполняют работу по присвоению значения объекту 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
по атрибуту? У вас есть два варианта, либо отраженный свойства, или через правильную установку атрибута:element.setAttribute("required", ""); //Correct edName.required = true; //Correct
строго говоря, любое другое значение будет "набор" атрибутов. Но определение
Boolean
атрибуты диктуют, что он должен быть установлен только в пустую строку""
указать правда. Следующие методы все работают на set в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
как ясный требуются?
трюк при попытке удалить the
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" значения, чтобы отключить его, и истинные значения, чтобы включить его. Но просто придерживайтесь истинного и ложного для ясности.как Регистрация на
required
?проверьте наличие атрибута через
.hasAttribute("required")
способ:if (edName.hasAttribute("required") { }
вы также можете проверить его с помощью Boolean отражение
.required
свойство:if (edName.required) { }
и версия jquery:
$('input').attr('required', true) $('input').attr('required', false)
Я знаю, что это вне вопроса, но, возможно, кто-то найдет это полезным :)