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. Кроудеру удалось указать отраженные свойства , я узнал, что следующий синтаксис неверен:
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:
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:
//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")
========================== =============== =========================
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)
Попытка получить доступ к коллекции .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" выключить его и правдивые значения, чтобы включить его. Но для ясности просто придерживайтесь истины и ложности.
required
? Проверить наличие атрибута через .hasAttribute("required")
:
if (edName.hasAttribute("required")
{
}
Вы также можете проверить это через свойство Boolean .required
:
if (edName.required)
{
}
Предполагая, что объект действительно является numpy
массивом, он известен как расширенная индексация и выбирает указанные столбцы:
>>> import numpy as np
>>> a = np.arange(12).reshape(3,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> a[:, [1,2,3]]
array([[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]])
>>> a[:, [1,3]]
array([[ 1, 3],
[ 5, 7],
[ 9, 11]])
Обратите внимание, что это выиграло Не работайте со стандартным списком Python:
>>> a.tolist()
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]
>>> a.tolist()[:,[1,2,3]]
Traceback (most recent call last):
File "<ipython-input-17-7d77de02047a>", line 1, in <module>
a.tolist()[:,[1,2,3]]
TypeError: list indices must be integers, not tuple
Он генерирует сложное значение и передает его на __*item__()
:
>>> class Foo(object):
... def __getitem__(self, val):
... print val
...
>>> Foo()[:, [1, 2, 3]]
(slice(None, None, None), [1, 2, 3])
То, что он на самом деле выполняет , зависит от индексируемого типа .