HTML属性的长度是否有限制?

252

HTML中属性值的长度有没有限制?

我正在一个新应用程序中使用HTML5风格的数据属性(data-foo="bar"),在某些情况下,我需要存储大量的数据(超过100个字符)。虽然我认为这个数量没有问题,但它引发了一个问题,即多少才算太多?


1
另外需要注意的是,预计会非常长的另一个属性是 iframe@srcdocMDN - HTML5.2),其中包含了整个文档。(我听说你喜欢文档,所以...) - FelipeAls
8个回答

316

HTML5没有对属性值的长度限制。

正如规范所述,“这个 HTML 版本因此返回到了非 SGML 基础上。”

随后,在描述如何解析 HTML5 时,出现了以下段落(强调已添加):

下面描述的算法对生成的 DOM 树深度或标签名称、属性名称、属性值、文本节点等的长度没有限制。虽然鼓励实现者避免任意的限制,但承认实际情况可能会迫使用户代理施加嵌套深度约束。

因此,(理论上)HTML5 属性的长度/大小没有限制

请参见修订历史记录以获取有关 HTML4 的原始答案。


174

我刚编写了一个测试(注意!请参见下面的更新),将长度为1000万的字符串放入属性中,然后再次检索,它可以正常工作(Firefox 3.5.2和Internet Explorer 7)。

5000万会导致浏览器挂起并显示“此脚本正在花费很长时间来完成”消息。

更新:我已经修复了脚本:它以前将innerHTML设置为长字符串,现在它设置为数据属性。 https://output.jsbin.com/wikulamuni 对于我来说,它可以处理长度为1亿。你的情况可能不同。

el.setAttribute('data-test', <<a really long string>>)

2
哇,圣...! - Jey Geethan
请注意,setAttribute() 测试您是否可以在运行时设置值。我理解原始问题是要从解析的 HTML 文件中读取多少数据?也就是说,数据在 HTML 源中,您可以使用 getAttribute() 等方法来读取它。 - Mikko Rantalainen

11

我认为没有什么是不可能的。现在,您可以做到:

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

它可以正常工作。虽然有点难以阅读。


5

来自HTML5语法文档

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验证器(高度实验性)验证您的文档。


2
我从未听说过属性长度有任何限制。
在HTML 4.01规范中,属性部分没有提到任何限制。
同样地,在HTML 4.01 DTD中也是如此——事实上,据我所知,DTD不允许您对属性指定长度。
如果在HTML 4中没有关于此事的规定,我不认为HTML 5会出现这种情况——事实上,在HTML 5的9.1.2.3 属性部分中,我也没有看到任何长度限制。

2

根据http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data,每个HTML元素可以指定任意数量的自定义数据属性和任何值。

用于解析/处理这些data-*属性值的内容将会有其限制。

事实证明,data-属性和值被放置在DOMStringMap对象中。该对象没有固有的限制。

根据http://dev.w3.org/html5/spec/Overview.html#domstringmap,DOMStringMap是一个接口,具有getter、setter、greator和deleter。setter有两个参数:DOMString类型的name和value。值为DOMString类型,直接映射到JavaScript String。

根据https://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string,JavaScript字符串的最大长度是由实现确定的。


2

最近在Edge(版本81.0.416.58(64位))中进行了测试,发现数据属性似乎有64k的限制。


1

5
HTML5不是基于SGML的语言。 - William Brendel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接