Есть ли ограничение на длину атрибутов HTML?

213

Как долго это слишком долго для значения атрибута в HTML?

Я использую атрибуты данных в стиле HTML5 ( data-foo="bar") в новом приложении, и в одном месте было бы очень удобно хранить большое количество данных (более 100 символов). Хотя я подозреваю, что с этой суммой все в порядке, возникает вопрос, сколько это слишком много?

nickf
источник
1
Для информации, еще один атрибут, который, как ожидается, будет очень длинным iframe@srcdoc( MDN (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) - [HTML5.2, который содержит целый документ ( Я слышал, что вам так понравились документы (…) )
FelipeAls

Ответы:

265

HTML 4

С точки зрения HTML 4, атрибуты являются конструкцией SGML. Их пределы определены в декларации SGML HTML 4 :

         КОЛИЧЕСТВО SGMLREF
                  ATTCNT 60 - повышенный -
                  ATTSPLEN 65536 - это самые большие значения -
                  LITLEN 65536 - разрешено в декларации -
                  NAMELEN 65536 - Избегайте фиксированных ограничений в фактическом -
                  PILEN 65536 - реализации HTML UA -
                  TAGLVL 100
                  TAGLEN 65536
                  GRPGTCNT 150
                  GRPCNT 64

Здесь рассматривается значение «ATTSPLEN», которое будет ограничением в списке спецификаций атрибутов элемента (который должен быть общим размером всех атрибутов для этого элемента). В приведенном выше примечании упоминается, что следует избегать фиксированных пределов, поэтому, скорее всего, в большинстве реализаций нет никакого реального предела, кроме доступной памяти.

HTML 5

HTML 5 кажется другим, как говорится в спецификации : «Таким образом, эта версия HTML возвращается к не-SGML-основе».

Позже, при описании того, как анализировать HTML 5, появляется следующий отрывок ( выделение добавлено):

Описанный ниже алгоритм не ограничивает глубину сгенерированного дерева DOM или длину имен тегов, имен атрибутов, значений атрибутов , текстовых узлов и т. Д. Хотя разработчикам рекомендуется избегать произвольных ограничений, признается, что практические проблемы вероятно, заставит пользовательских агентов наложить ограничения на глубину вложения.

Итак, я полагаю, это ваш ответ.

bobbymcr
источник
25
Таким образом, ответ должен быть «неограниченным» тогда?
Андерс Линден
1
Спасибо! Хотя я не могу выразить свое мнение - этот ответ был бы замечательным, если бы ему предшествовало что-то вроде: «Атрибуты HTML теоретически не имеют ограничения по размеру». Это очень много для чтения, просто чтобы уйти с таким простым ответом.
Риного
144

Я только что написал тест, который помещает строку длиной 10 миллионов в атрибут, а затем извлекает ее снова, и она отлично работает (Firefox 3.5.2 и Internet Explorer 7)

50 миллионов заставляют браузер зависать с сообщением «Этот сценарий занимает много времени».

nickf
источник
4
10 миллионов - это огромное количество данных.
Рауль
3
Я только что отредактировал этот скрипт, чтобы установить размер 50 миллионов, и он сработал, но установка его на 100 миллионов убила вкладку в Chrome, прежде чем я даже получил возможность протестировать его. : P
cHao
4
@nickf: он практически ограничен (например, памятью), но теоретически неограничен;)
Тим Шмельтер,
из памяти
гольмий
Спасибо за то, что просто получили товар. Если бы я хотел прочитать спецификацию SGML, я бы посмотрел спецификацию SGML!
Риного
6

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

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

и работает нормально. Хотя и немного нечитабельно.

priestc
источник
27
Немного. -----
Пол Дрейпер
4

Из документа HTML5 синтаксиса

9.1.2.3 Атрибуты

Атрибуты элемента выражаются внутри начального тега элемента.

Атрибуты имеют имя и значение. Имена атрибутов должны состоять из одного или нескольких символов, отличных от пробелов, U + 0000 NULL, U + 0022 МАРКА ЦИТАТЫ ("), U + 0027 APOSTROPHE ('), U + 003E ЗНАК БОЛЬШЕ, ЧЕМ (>), U + 002F SOLIDUS (/) и U + 003D EQUALS SIGN (=) символы, управляющие символы и любые символы, которые не определены Unicode. В синтаксисе HTML имена атрибутов могут быть записаны с любым сочетанием строчных и прописных букв это ASCII-регистрозависимое совпадение имени атрибута.

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

Атрибуты могут быть указаны четырьмя различными способами:

  1. Синтаксис пустого атрибута

  2. Синтаксис значения без кавычек

  3. Синтаксис значения атрибута в одинарных кавычках

  4. Синтаксис значений атрибутов в двойных кавычках

Здесь не упоминается ограничение на размер значения атрибута. Поэтому я думаю, что не должно быть ни одного.

Вы также можете проверить свой документ по

HTML5 Validator (очень экспериментальный)

Рахул
источник
1

Я никогда не слышал о каких-либо ограничениях на длину атрибутов.

В спецификациях HTML 4.01 в разделе «Атрибуты» нет ничего, что упоминало бы какие-либо ограничения на это.

То же самое в HTML 4.01 DTD - фактически, насколько я знаю, DTD не позволяет вам указывать длину для атрибутов.

Если в HTML 4 об этом ничего нет, я не представляю, что подобное появилось бы для HTML 5 - и я на самом деле не вижу никаких ограничений длины в разделе Атрибуты 9.1.2.3 для HTML 5.

Паскаль МАРТИН
источник
1

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

Каждый элемент HTML может иметь любое количество пользовательских атрибутов данных с любым значением.

То, что используется для анализа / обработки этих значений атрибута data- *, будет иметь ограничения.

Оказывается, атрибуты данных и значения помещаются в объект DOMStringMap. Это не имеет внутренних ограничений.

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

Примечание. Определение интерфейса DOMStringMap здесь предназначено только для сред JavaScript. Привязки других языков должны будут определить, как DOMStringMap должен быть реализован для этих языков.

DOMStringMap - это интерфейс с методами получения, установки, изменения и удаления. Сеттер имеет два параметра типа DOMString, name и value. Значение имеет тип DOMString, который отображается непосредственно в строку JavaScript.

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

Максимальная длина строки JavaScript зависит от конкретной реализации.

[примечание: chrome сообщает bytes.com как источник вредоносного ПО, так что будьте осторожны]

Луис Филипе
источник
0

SGML определяет атрибуты с набором пределов в 65 тыс. Символов, с которым можно ознакомиться здесь: http://www.highdots.com/forums/html/length-html-attribute-175546.html.

Хотя за то, что ты делаешь, у тебя все должно быть хорошо. Что касается верхних пределов, я видел, что jQuery использует атрибуты данных, которые также содержат несколько тысяч данных.

SuperRoach
источник
5
HTML5 не является языком на основе SGML.
Уильям Брендель
0

Протестировано недавно в Edge (версия 81.0.416.58 (64 бита)), и атрибуты данных, кажется, имеют ограничение в 64 КБ.

Питер Вахер
источник