Чи існує обмеження довжини атрибутів HTML?


213

Скільки часу занадто довго для значення атрибута в HTML?

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


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 або довжину імен тегів, імен атрибутів, значень атрибутів , текстових вузлів тощо. Хоча розробникам рекомендується уникати довільних обмежень, визнається, що практичні проблеми швидше за все, змусить агентів користувача накладати обмеження глибини вкладення.

Тож я гадаю, що це ваша відповідь.


25
Тож відповідь тоді повинна бути "необмеженою"?
Anders Lindén

1
Дякую! Хоча я не можу заперечувати - ця відповідь була б чудовою, якби вона мала попереднє щось на кшталт "Атрибути HTML теоретично не мають обмеження розміру". Це читання чимало, лише щоб вийти з такою простою відповіддю.
rinogo

144

Я щойно написав тест, який додає рядок довжиною 10 мільйонів в атрибут, а потім знову отримує його, і він працює добре (Firefox 3.5.2 та Internet Explorer 7)

50 мільйонів змушують браузер висіти із повідомленням "Цей сценарій потребує тривалого часу для завершення".


4
10 мільйонів - це така величезна кількість даних.
rahul

3
Я щойно відредагував цей скрипт, щоб він встановив розмір 50 мільйонів, і він працював, але встановивши його на 100 мільйонів, він вбив вкладку в Chrome, перш ніж я навіть отримав можливість перевірити його. : P
cHao

4
@nickf: Це практично обмежено (наприклад, по пам’яті), але теоретично необмежене;)
Тім Шмелтер

з пам'яті розбився
Гольма

Дякуємо за те, що ви просто перейшли до товару. Якби я хотів прочитати специфікацію SGML, я б шукав специфікацію SGML!
rinogo

6

Я дійсно не думаю, що існує обмеження. Я знаю, тепер ти можеш зробити

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

і це чудово працює. Хоча трохи нечитабельним.


27
Трішки. -----
Пол Дрейпер

4

З синтаксису HTML5 doc

9.1.2.3 Атрибути

Атрибути для елемента виражаються всередині початкового тегу елемента.

Атрибути мають ім’я та значення. Імена атрибутів повинні складатися з одного або декількох символів, крім символів пробілу, U + 0000 NULL, U + 0022 QUOTATION MARK ("), U + 0027 APOSTROPHE ('), U + 003E GREATER-THAN SIGN (>), U + Символи 002F SOLIDUS (/) та U + 003D EQUALS SIGN (=), контрольні символи та будь-які символи, які не визначені Unicode. У синтаксисі HTML назви атрибутів можуть бути записані будь-якою сумішшю малих та великих літер що є невідчутним до регістру ASCII іменем атрибута.

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

Атрибути можна вказати чотирма різними способами:

  1. Порожній синтаксис атрибута

  2. Синтаксис значення атрибута без котирування

  3. Одноцитований синтаксис значення атрибута

  4. Синтаксис значення подвійного котирування

Тут не згадується обмеження щодо розміру значення атрибута. Тому я думаю, що їх не повинно бути.

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

Перевірка HTML5 (високоекспериментальний)


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, ім'я та значення. Значення типу DOMString, яке відображається безпосередньо в рядку JavaScript.

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

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

[зверніть увагу: chrome повідомляє bytes.com як джерело зловмисного програмного забезпечення, тому будьте уважні]


0

SGML визначає атрибути з обмеженим набором 65k charecters, переглянуте тут: http://www.highdots.com/forums/html/length-html-attribute-175546.html

Хоча за те, що ти робиш, ти маєш добре. Що стосується верхніх меж, я бачив, що атрибути даних jQuery використовують також кілька к даних особисто.


5
HTML5 не є мовою на основі SGML.
Вільям Брендель

0

Нещодавно випробувано в Edge (версія 81.0.416.58 (64 біт)), а атрибути даних, схоже, мають обмеження 64k.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.