对于HTML中的属性值来说,多长时间算太长?

我在一个新的应用程序中使用HTML5风格的数据属性(data-foo="bar"),在一个地方存储大量数据(超过100个字符)真的很方便。虽然我怀疑这个数量是可以的,但它提出了一个问题:多少才算太多?


当前回答

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

正如规范所说,“这个版本的HTML因此回到了非sgml的基础上。”

稍后,当描述如何解析HTML5时,会出现以下段落(强调):

算法如下所述 DOM树的深度没有限制 生成的,或标记的长度 名称,属性名称,属性 值、文本节点等。而 实现者被鼓励避免 这是公认的任意限制 这种实际的担忧很可能 强制用户代理强制嵌套 深度的限制。

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

查看修订历史的原始答案涵盖HTML4。

其他回答

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

5000万会让浏览器显示“这个脚本需要很长时间才能完成”的信息。

更新:我已经修复了脚本:它以前设置innerHTML为一个长字符串,现在它正在设置一个数据属性。https://output.jsbin.com/wikulamuni它为我工作,长度为1亿。YMMV。

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

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

来自HTML5语法文档

9.1.2.3 Attributes Attributes for an element are expressed inside the element's start tag. Attributes have a name and a value. Attribute names must consist of one or more characters other than the space characters, U+0000 NULL, U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('), U+003E GREATER-THAN SIGN (>), U+002F SOLIDUS (/), and U+003D EQUALS SIGN (=) characters, the control characters, and any characters that are not defined by Unicode. In the HTML syntax, attribute names may be written with any mix of lower- and uppercase letters that are an ASCII case-insensitive match for the attribute's name. Attribute values are a mixture of text and character references, except with the additional restriction that the text cannot contain an ambiguous ampersand. Attributes can be specified in four different ways: Empty attribute syntax Unquoted attribute value syntax Single-quoted attribute value syntax Double-quoted attribute value syntax

这里没有提到属性值的大小限制。所以我认为不应该有。

方法验证文档的有效性

HTML5验证器(高度实验性)

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

正如规范所说,“这个版本的HTML因此回到了非sgml的基础上。”

稍后,当描述如何解析HTML5时,会出现以下段落(强调):

算法如下所述 DOM树的深度没有限制 生成的,或标记的长度 名称,属性名称,属性 值、文本节点等。而 实现者被鼓励避免 这是公认的任意限制 这种实际的担忧很可能 强制用户代理强制嵌套 深度的限制。

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

查看修订历史的原始答案涵盖HTML4。

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

每个HTML元素都可以指定任意数量的自定义数据属性和任意值。

用于解析/处理这些数据的-*属性值将具有 的局限性。

结果数据属性和值被放置在一个DOMStringMap对象中。 这没有内在的限制。

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

注意:这里的DOMStringMap接口定义仅用于JavaScript 环境。其他语言绑定需要定义DOMStringMap的方式 为这些语言实现

DOMStringMap是一个具有getter、setter、greator和delete的接口。 setter有两个DOMString类型的参数,name和value。 该值的类型为DOMString,它直接映射到一个JavaScript字符串。

从https://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string:

JavaScript字符串的最大长度是特定于实现的。