【问题标题】:Is there a limit to the length of HTML attributes?HTML 属性的长度有限制吗?
【发布时间】:2010-12-02 12:54:57
【问题描述】:

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

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

【问题讨论】:

标签: html custom-data-attribute


【解决方案1】:

HTML 4

从 HTML 4 的角度来看,属性是一种 SGML 构造。它们的限制在SGML Declaration of HTML 4 中定义:

数量 SGMLREF ATTCNT 60 -- 增加 -- ATTSPLEN 65536 -- 这些是最大值 -- LITLEN 65536——在声明中允许—— NAMELEN 65536 -- 在实际中避免固定限制 -- PILEN 65536 -- HTML UA 的实现 -- TAGLVL 100 泰格伦 65536 GRGTCNT 150 玻璃钢 64

这里讨论的值是“ATTSPLEN”,它是元素属性规范列表的限制(应该是该元素所有属性的总大小)。上面的注释提到应该避免固定限制,因此在大多数实现中,除了可用内存之外,很可能没有真正的限制。

HTML 5

HTML 5 似乎对属性值的长度没有限制

正如the spec 所说,“因此,此版本的 HTML 回归到非 SGML 基础。”

稍后,在描述如何解析 HTML 5 时,出现以下段落(强调添加):

下面描述的算法地方 没有限制 DOM 树的深度 生成,或标签的长度上 名称、属性名称、属性 值、文本节点等。而 鼓励实施者避免 任意限制,这是公认的 实际问题可能 强制用户代理强制嵌套 深度限制。

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

【讨论】:

  • 那么答案应该是“无限”吧?
  • 谢谢!虽然我不能投票 - 如果这个答案以“理论上 HTML 属性没有大小限制”之类的开头,那就太好了。读了这么多书才能得到这么简单的答案。
【解决方案2】:

我刚刚written a test(注意!请参阅下面的更新)将长度为 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>>)

【讨论】:

  • 1000 万是如此庞大的数据量。
  • 我刚刚编辑了该脚本以将大小设置为 5000 万并且它工作,但将其设置为 1 亿在我什至有机会测试它之前杀死了 Chrome 中的选项卡。 :P
  • @nickf:实际上是有限的(例如内存),但理论上是无限的;)
  • 内存不足崩溃
  • 感谢您直接收货。如果我想阅读 SGML 规范,我会查找 SGML 规范!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    来自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 类型的参数,名称和值。 该值是直接映射到 JavaScript 字符串的 DOMString 类型。

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

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

    [注意:chrome 将 bytes.com 报告为恶意软件的来源,因此请注意 ]

    【讨论】:

      【解决方案5】:

      来自HTML5 syntax doc

      9.1.2.3 属性

      元素的属性是 在元素的开头表示 标记。

      属性具有名称和值。 属性名称必须由一个或 空格以外的更多字符 字符,U+0000 NULL,U+0022 引号 ("), U+0027 撇号 ('), U+003E 大于号 (>), U+002F SOLIDUS (/) 和 U+003D 等于 SIGN (=) 字符,控件 字符,以及任何字符 不是由 Unicode 定义的。在里面 HTML 语法,属性名称可能是 用任何混合的低和 ASCII 大写字母 不区分大小写的匹配 属性的名称。

      属性值是文本的混合 和字符引用,除了 附加限制 文本不能包含歧义 和号。

      属性可以指定四个 不同的方式:

      1. 空属性语法

      2. 不带引号的属性值语法

      3. 单引号属性值语法

      4. 双引号属性值语法

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

      您还可以对照验证您的文档

      HTML5 Validator(Highly Experimental)

      【讨论】:

        【解决方案6】:

        SGML 使用 65k 字符的限制集定义属性,见此处: http://www.highdots.com/forums/html/length-html-attribute-175546.html

        虽然对于你正在做的事情,你应该没问题。 至于上限,我看到 jQuery 使用数据属性个人也持有几 k 的数据。

        【讨论】:

        • HTML5 不是基于 SGML 的语言。
        【解决方案7】:

        我从未听说过对属性长度有任何限制。

        在 HTML 4.01 规范中,section on Attributes 中没有提及对此的任何限制。

        HTML 4.01 DTD 中也是如此——事实上,据我所知,DTD 不允许您为属性指定长度。

        如果 HTML 4 中没有这方面的内容,我不认为 HTML 5 会出现类似的情况——而且我实际上在 HTML 5 的9.1.2.3 Attributes 部分中也没有看到任何长度限制。

        【讨论】:

          【解决方案8】:

          我真的不认为有任何限制。我知道现在你可以做到

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

          而且效果很好。虽然有点看不懂。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-22
            • 2014-04-25
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2016-08-16
            相关资源
            最近更新 更多