HTML中属性值的长度有没有限制?
我正在一个新应用程序中使用HTML5风格的数据属性(data-foo="bar"
),在某些情况下,我需要存储大量的数据(超过100个字符)。虽然我认为这个数量没有问题,但它引发了一个问题,即多少才算太多?
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亿。你的情况可能不同。
el.setAttribute('data-test', <<a really long string>>)
setAttribute()
测试您是否可以在运行时设置值。我理解原始问题是要从解析的 HTML 文件中读取多少数据?也就是说,数据在 HTML 源中,您可以使用 getAttribute()
等方法来读取它。 - Mikko Rantalainen我认为没有什么是不可能的。现在,您可以做到:
<a onclick=" //...insert 100KB of javascript code here">
它可以正常工作。虽然有点难以阅读。
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大小写不敏感匹配。
属性值是文本和字符引用的混合,除了文本不能包含模棱两可的&符号外,没有其他限制。
属性可以用四种不同的方式指定:
空属性语法
未引用的属性值语法
单引号属性值语法
双引号属性值语法
这里没有提到属性值的大小限制,因此我认为没有限制。
您还可以使用HTML5验证器(高度实验性)验证您的文档。
根据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字符串的最大长度是由实现确定的。
最近在Edge(版本81.0.416.58(64位))中进行了测试,发现数据属性似乎有64k的限制。
SGML定义了一组限制为65k个字符的属性,可以在此处看到: http://www.highdots.com/forums/html/length-html-attribute-175546.html
虽然对于你正在做的事情来说,这应该是足够的。 至于上限,我个人见过jQuery使用数据属性保存几千个数据。
iframe@srcdoc
(MDN - HTML5.2),其中包含了整个文档。(我听说你喜欢文档,所以...) - FelipeAls