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?

nickf
fonte
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.

bobbymcr
fonte
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".

nickf
fonte
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.

padre
fonte
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)

rahul
fonte
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.

Pascal MARTIN
fonte
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]

Luis Filipe
fonte
0

O SGML define atributos com um conjunto de limites de 65 mil caracteres, visto aqui: http://www.highdots.com/forums/html/length-html-attribute-175546.html

Embora pelo que você esteja fazendo, você esteja bem. Quanto aos limites superiores, eu já vi o jQuery usar atributos de dados com alguns k de dados pessoalmente.

SuperRoach
fonte
5
HTML5 não é uma linguagem baseada em SGML.
William Brendel
0

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

Peter Waher
fonte