Czy istnieje ograniczenie długości atrybutów HTML?

213

Jak długo jest za długa dla wartości atrybutu w HTML?

Korzystam z atrybutów danych w stylu HTML5 ( data-foo="bar") w nowej aplikacji, a w jednym miejscu byłoby bardzo przydatne, aby przechowywać dość dużą ilość danych (powyżej 100 znaków). Chociaż podejrzewam, że ta kwota jest w porządku, rodzi się pytanie, ile to za dużo?

pseudonim
źródło
1
Dla informacji, jednym innym atrybutem, który ma być bardzo długi, jest iframe@srcdoc( MDN (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) - [HTML5.2, który zawiera cały dokument ( Słyszałem, że lubisz dokumenty, więc (…) )
FelipeAls

Odpowiedzi:

265

HTML 4

Z perspektywy HTML 4 atrybuty są konstrukcją SGML. Ich ograniczenia są określone w Deklaracji SGML HTML 4 :

         ILOŚĆ SGMLREF
                  ATTCNT 60 - zwiększony -
                  ATTSPLEN 65536 - Są to największe wartości -
                  LITLEN 65536 - dozwolone w deklaracji -
                  NAMELEN 65536 - Unikaj ustalonych limitów w rzeczywistości -
                  PILEN 65536 - implementacje HTML UA -
                  TAGLVL 100
                  TAGLEN 65536
                  GRPGTCNT 150
                  GRPCNT 64

Chodzi tu o „ATTSPLEN”, który byłby limitem na liście specyfikacji atrybutów elementu (który powinien być całkowitym rozmiarem wszystkich atrybutów dla tego elementu). W powyższej uwadze wspomniano jednak, że należy unikać ustalonych limitów, więc jest prawdopodobne, że w większości implementacji nie ma rzeczywistego limitu poza dostępną pamięcią.

HTML 5

HTML 5 wydaje się być inny, jak podaje specyfikacja : „Ta wersja HTML powraca więc do wersji innej niż SGML”.

Później, opisując sposób analizowania HTML 5, pojawia się następujący fragment ( wyróżnienie dodane):

Algorytm opisany poniżej nie ogranicza głębokości wygenerowanego drzewa DOM ani długości nazw znaczników, nazw atrybutów, wartości atrybutów , węzłów tekstowych itp. Chociaż implementatorzy są zachęcani do unikania arbitralnych limitów, uznaje się, że problemy praktyczne prawdopodobnie zmusi agentów użytkownika do narzucenia ograniczeń głębokości zagnieżdżenia.

Więc przypuszczam, że to twoja odpowiedź.

Bobbymcr
źródło
25
Zatem odpowiedź powinna być „nieograniczona”?
Anders Lindén,
1
Dziękuję Ci! Chociaż nie mogę głosować - ta odpowiedź byłaby cudowna, gdyby była poprzedzona czymś w rodzaju: „Atrybuty HTML teoretycznie nie mają limitu rozmiaru”. To dużo czytania tylko po to, aby uzyskać tak prostą odpowiedź.
rinogo,
144

Właśnie napisałem test, który umieszcza ciąg o długości 10 milionów w atrybucie, a następnie ponownie go pobiera i działa dobrze (Firefox 3.5.2 i Internet Explorer 7)

50 milionów powoduje zawieszenie się przeglądarki z komunikatem „Ten skrypt zajmuje dużo czasu”.

pseudonim
źródło
4
10 milionów to tak ogromna ilość danych.
rahul
3
Właśnie edytowałem ten skrypt, aby ustawić rozmiar na 50 milionów i zadziałało, ale ustawienie go na 100 milionów zabiło kartę w Chrome, zanim jeszcze miałem okazję ją przetestować. : P
cHao
4
@nickf: Jest praktycznie ograniczony (np. przez pamięć), ale teoretycznie nieograniczony;)
Tim Schmelter
z pamięci rozbił się
holmium
Dzięki za przejście od razu do towaru. Gdybym chciał przeczytać specyfikację SGML, sprawdziłbym specyfikację SGML!
rinogo,
6

Naprawdę nie sądzę, że jest jakiś limit. Wiem, że teraz możesz to zrobić

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

i działa dobrze. Chociaż trochę nieczytelne.

kapłan
źródło
27
Trochę. -----
Paul Draper,
4

Z dokumentu składni HTML5 doc

9.1.2.3 Atrybuty

Atrybuty elementu są wyrażone w znaczniku początkowym elementu.

Atrybuty mają nazwę i wartość. Nazwy atrybutów muszą składać się z co najmniej jednego znaku innego niż spacja, U + 0000 NULL, U + 0022 ZNAK CYTATU ("), U + 0027 APOSTROPHE ('), U + 003E WIĘKSZY NIŻ ZNAK (>), U + 002F Znaki SOLIDUS (/) i U + 003D EQUALS SIGN (=), znaki kontrolne i dowolne znaki, które nie są zdefiniowane przez Unicode W składni HTML nazwy atrybutów można zapisywać dowolną kombinacją małych i wielkich liter które są zgodne bez rozróżniania wielkości liter w ASCII dla nazwy atrybutu.

Wartości atrybutów są mieszanką odniesień do tekstu i znaków, z wyjątkiem dodatkowego ograniczenia, że ​​tekst nie może zawierać niejednoznacznych znaków ampersand.

Atrybuty można określić na cztery różne sposoby:

  1. Pusta składnia atrybutu

  2. Niecytowana składnia wartości atrybutu

  3. Składnia wartości pojedynczego cudzysłowu

  4. Podwójnie cytowana składnia wartości atrybutu

Tutaj nie wspomniano o limicie wielkości wartości atrybutu. Myślę więc, że nie powinno być.

Możesz także zweryfikować swój dokument pod kątem

Walidator HTML5 (wysoce eksperymentalny)

Rahul
źródło
1

Nigdy nie słyszałem o żadnym ograniczeniu długości atrybutów.

W specyfikacjach HTML 4.01 w sekcji Atrybuty nic nie wspomina o żadnych ograniczeniach.

To samo w DTD HTML 4.01 - w rzeczywistości, o ile mi wiadomo, DTD nie pozwala na określenie długości atrybutów.

Jeśli w HTML 4 nie ma nic takiego, nie wyobrażam sobie, aby coś takiego pojawiało się w HTML 5 - i faktycznie nie widzę żadnych ograniczeń długości w sekcji Atrybuty 9.1.2.3 dla HTML 5.

Pascal MARTIN
źródło
1

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

Każdy element HTML może mieć dowolną liczbę niestandardowych atrybutów danych o dowolnej wartości.

To, co jest używane do analizowania / przetwarzania tych wartości atrybutów data- *, będzie miało ograniczenia.

Okazuje się, że atrybuty danych i wartości są umieszczane w obiekcie DOMStringMap. To nie ma żadnych ograniczeń.

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

Uwaga: Definicja interfejsu DOMStringMap tutaj jest przeznaczona tylko dla środowisk JavaScript. Inne powiązania językowe będą musiały zdefiniować sposób implementacji DOMStringMap dla tych języków

DOMStringMap to interfejs z getter, setter, greator i deleter. Seter ma dwa parametry typu DOMString, nazwę i wartość. Wartość jest typu DOMString, która jest odwzorowana bezpośrednio na ciąg JavaScript.

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

Maksymalna długość ciągu JavaScript zależy od implementacji.

[uwaga: chrome zgłasza bytes.com jako źródło złośliwego oprogramowania, więc uwaga]

Luis Filipe
źródło
0

SGML Definiuje atrybuty z zestawem limitów wynoszącym 65 000 znaków, widoczne tutaj: http://www.highdots.com/forums/html/length-html-attribute-175546.html

Chociaż to, co robisz, powinno być w porządku. Jeśli chodzi o górne limity, widziałem, że jQuery korzysta z atrybutów danych, które przechowują także kilka tysięcy danych osobiście.

SuperRoach
źródło
5
HTML5 nie jest językiem opartym na SGML.
William Brendel
0

Testowane niedawno w Edge (wersja 81.0.416.58 (64 bity)), a atrybuty danych wydają się mieć limit 64k.

Peter Waher
źródło