Почему свойства HTML DOM также должны отражаться в атрибутах DOM HTML?

В этой статье говорится о том, что одна из важных причин отражения свойств HTML в DOM заключается в том, что селектора CSS полагаются на атрибуты, но почему это? Это можно сделать без отражения, основанного на спецификации.

Для людей, которые не знают, о чем я говорю, читайте ниже:

В браузерах селектора CSS полагаются на атрибуты для работы.

#myButton[someAttribute] {
  opacity: 0.5; 
  font-weight: bold
}

Итак, в нашем JavaScript, если мы изменим свойство элемента, в конечном итоге мы должны отразить его и в HTML DOM так:

// we have changed some property
myButton.someAttribute= true; 

// but this is not adequate, we need to reflect as well
myButton.setAttribute('someAttribute', '');

поэтому получим следующее:

<button id="myButton" someAttribute></button>

не эта неосвещенная кнопка:

<button id="myButton"></button>

Ответы

Ответ 1

Не все свойства DOM сопоставляются с атрибутами. Те, которые отражают атрибуты и атрибуты, делают это, чтобы сохранить четность с языком документа - в данном случае HTML, который имеет только концепцию атрибутов, которые, как вы правильно указали, зависят от селекторов.

Если селекторы атрибутов непосредственно сопоставлены с свойствами DOM без DOM, различающих свойства атрибута и другие свойства, тогда атрибуты выбора, такие как следующие, будут совпадать, хотя ни один из них не существует в качестве атрибутов в HTML:

[classList]
[className]
[dataset]
[offsetLeft]
[offsetTop]
[offsetWidth]
[offsetHeight]

... а также [someAttribute] сопоставление элементов с вашим несуществующим someAttribute как свойство, даже если вы не отражаете его с помощью setAttribute().

На самом деле, именно поэтому label[htmlFor] неправильно соответствует элементам label[for] в Internet Explorer 7, хотя атрибут for в HTML просто называется for, а не htmlFor - DOM использует htmlFor для воспользуйтесь тем, что for является зарезервированным словом на многих языках, включая JavaScript, основной язык сценариев DOM, не позволяя ему использоваться как идентификатор свойства.

Ответ 2

Атрибуты и свойства DOM не эквивалентны, но они связаны.

Атрибуты предназначены для инициализации свойств DOM. При анализе HTML все атрибуты используются для инициализации соответствующих свойств DOM. Если позже вы измените атрибут с помощью setAttribute или removeAttribute, соответствующее свойство также будет обновлено (аналогично перезагрузке HTML с новым атрибутом).

Но это не так. Обновление свойства не изменяет соответствующий атрибут. Вот почему вы можете назначить .value для ввода и увидеть это в отображении браузера, но когда вы посмотрите на элемент в Инструментах разработчика, вы все равно увидите исходный атрибут value="whatever". В некоторых случаях это имеет особые преимущества - когда вы нажимаете кнопку Reset формы, она сбрасывает все свойства value из своих атрибутов value.

Ответ 3

ИМХО; Некоторые атрибуты имеют сопоставление 1:1 со своими соответствующими свойствами в DOM. Отражение автоматически выполняется для общих атрибутов, таких как id. Вы также можете определить свои собственные атрибуты (ваш HTML будет считаться недействительным, но вы можете использовать doctype для проверки их). Я предполагаю, что из-за этой неопределенности, созданной атрибутами изгоев. Они предпочли отображать только атрибут: свойство, которое имеет предсказуемое поведение и использование. Вы все равно можете использовать свои пользовательские атрибуты в своем css, но вы находитесь в ручном режиме. Вы должны держать свои s ** t вместе и отражать их сами. Этот менталитет на западе (свобода) - это тот, который сделал веб-технологию настолько популярной и простой в использовании. Вы можете делать все по своему усмотрению. Я не рекомендую его для удобства, но вы можете.

Ответ 4

В вашем примере используется button, но в статье используется свойство disabled, но с чем-то, кроме кнопки. На button браузер автоматически отразит изменения в свойстве disabled в атрибуте и наоборот, но это не происходит со всеми элементами. Измените свой пример, чтобы использовать div, и вы увидите, что вам нужно будет вручную скопировать два, если нужно.

Или для пользовательских атрибутов вместо этого используйте атрибуты data-. Если вы delete свойство из my_element.dataset, я уверен, что атрибут также будет удален.

Ответ 5

Это означает, что HTML и DOM синхронизированы, потому что в какой-то момент селекторы CSS будут проверять элемент DOM и полагаться на точные атрибуты.

Если DOM неточен, то CSS также не будет точным. Что делать, если HTML не стал отражать атрибуты обратно в DOM?

Скажем, текст поля ввода изначально черный, и вы хотите, чтобы текст был красным, когда он отключен. Теперь скажем, что пользователь что-то сделал, а функция, которую вы написали, отключила поле ввода через javascript.

Если HTML не отражает, что атрибут "disabled" вернулся к DOM, CSS никогда не знал бы, что этот элемент был отключен.

Таким образом, цвет текста никогда не будет изменен на красный. Помните, что CSS проверяет и полагается на атрибуты DOM. Если HTML не изменяет атрибуты DOM, для всех CSS заботится, ничего не изменилось, поэтому все останется прежним.

Для менее технической аналогии, скажем, CSS - это Бэтмен, HTML - это полицейский отдел Gotham, атрибут - сигнал летучей мыши, а DOM - небо.

Бэтмен (css) постоянно проверяет небо (dom), чтобы узнать, отображается ли его индикатор (атрибут) летучей мыши в полицейском управлении Gotham (html). Если было какое-то событие (изменение атрибута), которое произошло в Готэме, где Департаменту полиции Готэма (html) понадобилось Бэтмен (css), чтобы помочь, но они просто не удосужились отправить ему обновление через небо (dom) с помощью bat-signal (обновление атрибутов), Бэтмен никогда не узнает, что есть работа, которая должна быть выполнена.

Я имею в виду, что он потрясающий супергерой, поэтому он, в конце концов, узнает, но, к сожалению, CSS не Бэтмен.

Ответ 6

В статье рассказывается о пользовательских элементах и берет пример элемента <div> с его естественным поведением для некоторых свойств, таких как hidden или disabled.

Итак, прежде всего, не принимайте предложение, которое вы упоминаете как указание от своего бога, потому что это не так.

Просто, если у вас есть приложение с некоторым css, использующим свойство disasbled для конкретного стиля, помните, что если вы хотите:

  • создать несколько пользовательских элементов
  • манипулировать своими атрибутами через Javascript, включая disasbled
  • см. css, примененный для свойства disasbled настраиваемых элементов, которыми вы управляете.

Тогда, да, вам нужно будет вернуться к DOM

Ответ 7

Ну, это первый вопрос, на который я отвечаю, но я попробую в любом случае.

Честно говоря, мне сложно сказать, что вы просите, но если вы хотите отразить изменения свойств HTMLElement на DOM (через атрибуты). Затем здесь код (используя HTMLElement 's):

// Defines a new property on an Object.
Object.defineProperty(HTMLElement.prototype, "someAttribute", {
    // Configurable
    configurable: true,

    // Enumerable
    enumerable: true,

    /* Getter
        (Allows you get the value like this =>
            element.someAttribute // returns the value of "someAttribute"
        )
    */
    get: function() {
        return this.getAttribute("someAttribute")
    },

    /* Setter
        (Allows you to modify/ update the value like this => 
            element.someAttribute = "lorem ipsum"
        )
    */
    set: function(data) {
        this.setAttribute("someAttribute", data)
    }
})

Надеюсь, это ответ на ваш вопрос.