Após as alterações feitas no jQuery 1.6.1, tentei definir a diferença entre propriedades e atributos em HTML.
Observando a lista nas notas de versão do jQuery 1.6.1 (próximo à parte inferior), parece que se pode classificar propriedades e atributos HTML da seguinte maneira:
Propriedades: tudo o que possui um valor booleano ou é calculado pelo UA, como selectedIndex.
Atributos: 'Atributos' que podem ser adicionados a um elemento HTML que não é booleano nem contém um valor gerado pelo UA.
Pensamentos?
javascript
html
dom
properties
schalkneethling
fonte
fonte
Respostas:
Ao escrever o código-fonte HTML, você pode definir atributos nos seus elementos HTML. Então, uma vez que o navegador analise seu código, um nó DOM correspondente será criado. Este nó é um objeto e, portanto, possui propriedades .
Por exemplo, este elemento HTML:
possui 2 atributos (
type
evalue
).Depois que o navegador analisa esse código, um objeto HTMLInputElement será criado e esse objeto conterá dezenas de propriedades como: accept, accessKey, align, alt, atributos, autofoco, baseURI, verificado, childElementCount, childNodes, children, classList, className, clientHeight, etc.
Para um determinado objeto do nó DOM, propriedades são as propriedades desse objeto e atributos são os elementos da
attributes
propriedade desse objeto.Quando um nó DOM é criado para um determinado elemento HTML, muitas de suas propriedades se relacionam a atributos com nomes iguais ou semelhantes, mas não é um relacionamento individual. Por exemplo, para este elemento HTML:
o nó DOM correspondente terá
id
,type
evalue
propriedades (entre outras):A
id
propriedade é uma propriedade refletida para oid
atributo: Obter a propriedade lê o valor do atributo e definir a propriedade grava o valor do atributo.id
é uma propriedade refletida pura , não modifica ou limita o valor.A
type
propriedade é uma propriedade refletida para otype
atributo: Obter a propriedade lê o valor do atributo e definir a propriedade grava o valor do atributo.type
não é uma propriedade refletida pura porque está limitada a valores conhecidos (por exemplo, os tipos válidos de uma entrada). Se você tivesse<input type="foo">
, entãotheInput.getAttribute("type")
te dá,"foo"
mastheInput.type
te dá"text"
.Por outro lado, a
value
propriedade não reflete ovalue
atributo. Em vez disso, é o valor atual da entrada. Quando o usuário altera manualmente o valor da caixa de entrada, avalue
propriedade refletirá essa alteração. Portanto, se o usuário"John"
inserir na caixa de entrada, então:enquanto que:
A
value
propriedade reflete o conteúdo de texto atual dentro da caixa de entrada, enquanto ovalue
atributo contém o conteúdo de texto inicial dovalue
atributo no código-fonte HTML.Portanto, se você quiser saber o que está atualmente dentro da caixa de texto, leia a propriedade Se você, no entanto, deseja saber qual era o valor inicial da caixa de texto, leia o atributo Ou você pode usar a
defaultValue
propriedade, que é um reflexo puro dovalue
atributo:Existem várias propriedades que refletem diretamente seu atributo (
rel
,id
), alguns são reflexos diretos com nomes ligeiramente diferentes (htmlFor
reflete ofor
atributo,className
reflete oclass
atributo), muitos que refletem seu atributo, mas com restrições / modificações (src
,href
,disabled
,multiple
), e assim por em. A especificação abrange os vários tipos de reflexão.fonte
for
->htmlFor
) e da mesma forma uma lista de propriedades que recebem seu valor inicial de um atributo, mas não o refletem (input.value
). Espero que isso esteja em algum lugar na fonte de uma biblioteca como github.com/Matt-Esch/virtual-dom, mas não está realmente documentado.Depois de ler a resposta de Sime Vidas , procurei mais e encontrei uma explicação muito direta e fácil de entender nos documentos angulares .
fonte
colspan
atributo tem acolSpan
propriedade ... Então, qual atributo não tem uma propriedade relacionada agora?As respostas já explicam como os atributos e as propriedades são tratados de maneira diferente, mas eu realmente gostaria de salientar como isso é totalmente insano . Mesmo que seja em certa medida a especificação.
É uma loucura ter alguns dos atributos (por exemplo , id, classe, foo, barra ) para reter apenas um tipo de valor no DOM, enquanto alguns atributos (por exemplo , verificados, selecionados ) para reter dois valores; isto é, o valor "quando foi carregado" e o valor do "estado dinâmico". (O DOM não deve representar o estado do documento em toda a sua extensão?)
É absolutamente essencial que dois campos de entrada , por exemplo, um texto e uma caixa de seleção se comportem da mesma maneira . Se o campo de entrada de texto não reter um valor separado "quando foi carregado" e o valor "dinâmico atual", por que a caixa de seleção? Se a caixa de seleção possui dois valores para o atributo marcado , por que não possui dois para seus atributos de classe e ID ? Se você espera alterar o valor de um campo de texto * input * e espera que o DOM (ou seja, a "representação serializada") mude e reflita essa mudança, por que diabos você não esperaria o mesmo de um campo de entrada de caixa de seleção tipo no atributo verificado?
A diferenciação de "é um atributo booleano" simplesmente não faz sentido para mim, ou é, pelo menos, não uma razão suficiente para isso.
fonte
checked
atributo é representado peladefaultChecked
propriedade (da mesma forma que para uma entrada de texto, ovalue
atributo é representado peladefaultValue
propriedade). Uma segunda propriedade,checked
é necessária para representar se a caixa de seleção está marcada porque esta é uma parte intrínseca da funcionalidade de uma caixa de seleção: é interativa e pode ser alterada (e redefinida para o padrão, se um botão de redefinição de formulário estiver presente) pelo usuário , de uma maneira que outro atributo comoid
não é. Não tem nada a ver com o fato de ser um atributo booleano.bem, eles são especificados pelo w3c o que é um atributo e o que é uma propriedade http://www.w3.org/TR/SVGTiny12/attributeTable.html
mas atualmente o attr e o prop não são tão diferentes e existem quase os mesmos
mas eles preferem adereços para algumas coisas
Bem, na verdade você não precisa alterar algo se usar attr ou prop ou ambos, ambos funcionam, mas eu vi no meu próprio aplicativo que prop funcionava onde o atrr não fazia, então peguei no meu 1.6 app prop =)
fonte
Diferença de propriedades e atributos HTML:
Vamos primeiro examinar as definições dessas palavras antes de avaliar qual é a diferença no HTML:
Definição em inglês:
No contexto HTML:
Quando o navegador analisa o HTML, ele cria uma estrutura de dados em árvore que basicamente é uma representação na memória do HTML. A estrutura de dados da árvore contém nós que são elementos e texto HTML. Os atributos e propriedades relacionados a isso são da seguinte maneira:
Também é importante perceber que o mapeamento dessas propriedades não é 1 para 1. Em outras palavras, nem todos os atributos que fornecemos em um elemento HTML terão uma propriedade DOM denominada semelhante.
Além disso, possui diferentes elementos DOM, diferentes propriedades. Por exemplo, um
<input>
elemento tem uma propriedade de valor que não está presente em uma<div>
propriedade.Exemplo:
Vamos pegar o seguinte documento HTML:
Em seguida, inspecionamos o
<div>
console JS:Vemos as seguintes propriedades do DOM (chrome devtools, nem todas as propriedades mostradas):
class
é a palavra-chave reservada em JS). Mas na verdade 2 propriedades,classList
eclassName
.fonte