Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему НЕ все атрибуты тега доступны как свойства соответствующего объекта? (https://javascript.ru/forum/misc/60603-pochemu-ne-vse-atributy-tega-dostupny-kak-svojjstva-sootvetstvuyushhego-obekta.html)

Keramet 10.01.2016 13:11

Почему НЕ все атрибуты тега доступны как свойства соответствующего объекта?
 
Допустим есть некий элемент div:
<div id='divID' name='myDiv' myAttr='some volume'>Мой див :)</div>

В коде получаем соответствующий ему объект:
var myDiv = document.getElementById("divID");

Почему у этого объекта (myDiv) некоторые свойства доступны и соответствуют атрибутам элемента, например:
console.log( myDiv.id );           // выводит  divID
console.log( myDiv.innerHTML );    // выводит  Мой див :)

А свойство name не доступно:
console.log( myDiv.name );         // выводит undefined

C myAttr вроде понятно - доступ к нему только через myDiv.getAttribute( "myAttr" ).
Но почему name не доступно как свойство myDiv.name ?

Яростный Меч 10.01.2016 13:28

Keramet,

name - не универсальный атрибут, он имеет смысл только для якорей и элементов формы. Потому для прочих тегов он "не подхватывается" в свойства объекта.

Keramet 10.01.2016 14:08

Цитата:

Сообщение от Яростный Меч (Сообщение 403139)
Keramet,

name - не универсальный атрибут, он имеет смысл только для якорей и элементов формы. Потому для прочих тегов он "не подхватывается" в свойства объекта.

А как понять, что атрибут - универсальный? Разве name не присутствует во всех тегах? или признак "уникальности" в чём-то другом?

Яростный Меч 10.01.2016 14:21

Цитата:

Сообщение от Keramet (Сообщение 403143)
А как понять, что атрибут - универсальный? Разве name не присутствует во всех тегах? или признак "уникальности" в чём-то другом?

вот список универсальных
http://htmlbook.ru/html/attr/common

laimas 10.01.2016 14:24

http://www.w3schools.com/tags/ref_st...attributes.asp

Атрибут name для тега А не поддерживается в HTML5.

ruslan_mart 10.01.2016 15:10

Keramet, только валидные атрибуты могут быть доступны как свойства, но у них тоже есть некоторые особенности, например: атрибут класс не будет доступен как свойство "class", так как это зарезервированное имя, поэтому необходимо указывать className, или такие свойства как disabled, checked и т.д. всегда будут возвращать булево значение, независимо от значения атрибута.

У дивов name не бывает, поэтому и не работает, так как это не валидно. Лучше использовать data-* атрибуты:

<div id="myDiv" data-name="foo"></div>

myDiv.dataset.name; //foo


Ну или написать свой геттер/сеттер:

Object.defineProperty(HTMLDivElement.prototype, 'name', {
   get: function() {
      return this.getAttribute('name') || '';
   },
   set: function(value) {
      this.setAttribute('name', value);
   }
});


<div id="myDiv" name="foo"></div>

myDiv.name; //foo

Keramet 10.01.2016 18:39

Ruslan_xDD,
спасибо


Часовой пояс GMT +3, время: 15:56.