Existe um limite para o comprimento dos atributos HTML?


213

Quanto tempo é longo demais para um valor de atributo em HTML?

Estou usando atributos de dados no estilo HTML5 ( data-foo="bar") em um novo aplicativo e, em um lugar, seria realmente útil armazenar uma boa quantidade de dados (mais de 100 caracteres). Embora eu suspeite que esse valor seja bom, isso levanta a questão de quanto é demais?


1
Para obter informações, outro atributo que se espera ser muito longo é iframe@srcdoc( MDN (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) - [HTML5.2, que contém um documento inteiro ( Ouvi dizer que você gostou de documentos, então (…) )
FelipeAls 15/01

Respostas:


265

HTML 4

Da perspectiva do HTML 4, os atributos são uma construção SGML. Seus limites estão definidos na Declaração SGML do HTML 4 :

         QUANTIDADE SGMLREF
                  ATTCNT 60 - aumentado -
                  ATTSPLEN 65536 - Estes são os maiores valores -
                  LITLEN 65536 - permitido na declaração -
                  NAMELEN 65536 - Evite limites fixos em tempo real -
                  PILEN 65536 - implementações de UA HTML -
                  TAGLVL 100
                  TAGLEN 65536
                  GRPGTCNT 150
                  GRPCNT 64

O valor em questão aqui é "ATTSPLEN", que seria o limite na lista de especificação de atributos de um elemento (que deve ser o tamanho total de todos os atributos para esse elemento). A observação acima menciona que os limites fixos devem ser evitados, no entanto, portanto, é provável que não exista outro limite real além da memória disponível na maioria das implementações.

HTML 5

O HTML 5 parece ser diferente, como diz a especificação : "Esta versão do HTML retorna, portanto, a uma base não-SGML".

Posteriormente, ao descrever como analisar o HTML 5, a seguinte passagem aparece ( ênfase adicionada):

O algoritmo descrito abaixo não limita a profundidade da árvore DOM gerada, nem o comprimento dos nomes de tags, nomes de atributos , valores de atributos , nós de texto, etc. Embora os implementadores sejam incentivados a evitar limites arbitrários, é reconhecido que preocupações práticas provavelmente forçará os agentes do usuário a impor restrições de profundidade de aninhamento.

Então, suponho que essa seja sua resposta.


25
Então a resposta deve ser "ilimitada" então?
Anders Lindén

1
Obrigado! Embora eu não possa votar de forma positiva - essa resposta seria maravilhosa se precedida de algo como "atributos HTML, teoricamente, não têm limite de tamanho". É muita leitura apenas para chegar a uma resposta tão simples.
rinogo 14/11/19

144

Acabei de escrever um teste que coloca uma sequência de 10 milhões de caracteres em um atributo e o recupera novamente, e funciona bem (Firefox 3.5.2 e Internet Explorer 7)

50 milhões fazem o navegador travar com a mensagem "Este script está demorando muito para ser concluído".


4
10 milhões são uma quantidade tão grande de dados.
rahul

3
Eu apenas editei esse script para definir o tamanho em 50 milhões e funcionou, mas defini-lo para 100 milhões matou a guia no Chrome antes mesmo de ter a chance de testá-lo. : P
cHao 5/09/12

4
@nickf: É praticamente limitada, mas, teoricamente, ilimitada;) (por exemplo, pela memória.)
Tim Schmelter

falta de memória caiu
hólmio

Obrigado por apenas ir direto para as mercadorias. Se eu quisesse ler a especificação SGML, procuraria na especificação SGML!
rinogo 14/11/19

5

Realmente não acho que exista um limite. Eu sei agora que você pode fazer

<a onclick=" //...insert 100KB of javascript code here">

e funciona bem. Embora um pouco ilegível.


25
Um pouco. -----
Paul Draper

4

Do documento de sintaxe HTML5

9.1.2.3 Atributos

Os atributos para um elemento são expressos dentro da tag inicial do elemento.

Os atributos têm um nome e um valor. Os nomes de atributo devem consistir em um ou mais caracteres diferentes dos caracteres de espaço, U + 0000 NULL, U + 0022 MARCA DE COTAÇÃO ("), U + 0027 APOSTROPHE ('), U + 003E SINAL MAIS GRANDE DO QUE (>), U + 002F SOLIDUS (/) e U + 003D EQUALS SIGN (=), caracteres de controle e quaisquer caracteres que não sejam definidos por Unicode.Na sintaxe HTML, os nomes de atributos podem ser escritos com qualquer combinação de letras maiúsculas e minúsculas que são uma correspondência que não diferencia maiúsculas de minúsculas ASCII para o nome do atributo.

Os valores dos atributos são uma mistura de referências de texto e caracteres, exceto com a restrição adicional de que o texto não pode conter um e comercial ambíguo.

Os atributos podem ser especificados de quatro maneiras diferentes:

  1. Sintaxe de atributo vazio

  2. Sintaxe do valor do atributo não citado

  3. Sintaxe de valor de atributo entre aspas simples

  4. Sintaxe do valor do atributo entre aspas duplas

Aqui não mencionou um limite no tamanho do valor do atributo. Então eu acho que não deveria haver nenhum.

Você também pode validar seu documento com relação ao

Validador HTML5 (altamente experimental)


1

Eu nunca ouvi falar de qualquer limite no tamanho dos atributos.

Nas especificações do HTML 4.01, na seção Atributos, não há nada que mencione qualquer limitação.

O mesmo no DTD do HTML 4.01 - de fato, até onde eu sei, o DTD não permite que você especifique um comprimento para os atributos.

Se não há nada sobre isso no HTML 4, não imagino que algo assim apareça no HTML 5 - e na verdade não vejo nenhuma limitação de comprimento na seção 9.1.2.3 Atributos para o HTML 5.


1

Em http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data :

Todo elemento HTML pode ter qualquer número de atributos de dados personalizados especificados, com qualquer valor.

O que é usado para analisar / processar esses dados- * valores de atributos terá limitações.

Acontece que os atributos e os dados dos dados são colocados em um objeto DOMStringMap. Isso não tem limites inerentes.

Em http://dev.w3.org/html5/spec/Overview.html#domstringmap :

Nota: A definição da interface DOMStringMap aqui destina-se apenas a ambientes JavaScript. Outras ligações de idiomas precisarão definir como o DOMStringMap será implementado para esses idiomas.

DOMStringMap é uma interface com um getter, setter, greator e deleter. O setter possui dois parâmetros do tipo DOMString, nome e valor. O valor é do tipo DOMString que é mapeado diretamente para uma String JavaScript.

De http://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string:

O comprimento máximo de uma String JavaScript é específico da implementação.

[nota: o chrome está relatando bytes.com como uma fonte de malware, portanto, cuidado]



0

Testado recentemente no Edge (versão 81.0.416.58 (64 bits)), e os atributos de dados parecem ter um limite de 64k.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.