提问人:nickf 提问时间:9/30/2009 最后编辑:Deduplicatornickf 更新时间:10/25/2022 访问量:94370
HTML 属性的长度是否有限制?
Is there a limit to the length of HTML attributes?
问:
HTML 中的属性值有多长才算太长?
我在一个新应用程序中使用 HTML5 样式的数据属性 (),在一个地方存储大量数据(超过 100 个字符)会非常方便。虽然我怀疑这个数量没问题,但它提出了一个问题,即多少才算太多?data-foo="bar"
答:
我真的不认为有任何限制。我知道现在你可以做到了
<a onclick=" //...insert 100KB of javascript code here">
而且效果很好。虽然有点不可读。
我从未听说过对属性长度有任何限制。
在 HTML 4.01 规范中,在属性部分中,没有提到对此的任何限制。
在 HTML 4.01 DTD 中也是如此——事实上,据我所知,DTD 不允许你指定属性的长度。
如果 HTML 4 中没有这方面的内容,我不认为 HTML 5 会出现类似的东西——而且我实际上在 HTML 5 的 9.1.2.3 属性部分也没有看到任何长度限制。
来自 HTML5 语法文档
9.1.2.3 属性
元素的属性包括 在元素的开始中表示 标记。
属性具有名称和值。 属性名称必须由一个或 空格以外的更多字符 字符,U+0000 NULL,U+0022 引号 (“), U+0027 撇号 ('), U+003E 大于符号 (>), U+002F SOLIDUS (/) 和 U+003D 等于 SIGN (=) 字符,控件 字符,以及任何 不是由 Unicode 定义的。在 HTML 语法,属性名称可以是 用 lower- 和 作为 ASCII 的大写字母 不区分大小写的匹配项 属性的名称。
属性值是文本的混合 和字符引用,但 附加限制 文本不能包含歧义 符号。
属性可以在四个中指定 不同的方式:
空属性语法
未加引号的属性值语法
单引号属性值语法
双引号属性值语法
这里没有提到对属性值大小的限制。所以我认为应该没有。
您还可以根据
我刚刚写了一个测试(注意!请参阅下面的更新)它将一个长度为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>>)
评论
setAttribute()
getAttribute()
SGML 定义具有 65k 个字符的限制集的属性,如下所示:http://www.highdots.com/forums/html/length-html-attribute-175546.html
虽然对于你正在做的事情,你应该没事。 至于上限,我已经看到jQuery使用数据属性个人也保存了几k个数据。
评论
HTML5 对属性值的长度没有限制。
正如规范所说,“因此,此版本的 HTML 将回归到非 SGML 基础。
稍后,在描述如何解析 HTML5 时,出现了以下段落(强调后加):
下面描述的算法对 DOM 树的深度没有限制 生成,或对标签的长度 名称, 属性名称, 属性 值、文本节点等。而 鼓励实施者避免 任意限制,它是公认的 实际问题可能会 强制用户代理强制嵌套 深度约束。
因此,(理论上)HTML5 属性的长度/大小没有限制。
有关涵盖 HTML4 的原始答案,请参阅修订历史记录。
从 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 是一个带有 getter、setter、greator 和 deleter 的接口。 setter 有两个 DOMString 类型的参数,name 和 value。 该值的类型为 DOMString,即直接映射到 JavaScript 字符串。
从 https://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string:
JavaScript 字符串的最大长度是特定于实现的。
最近在 Edge(版本 81.0.416.58(64 位))中进行了测试,数据属性似乎限制为 64k。
评论
iframe@srcdoc
)