【问题标题】:javascript generating invalid HTML5 attributes in Firefoxjavascript 在 Firefox 中生成无效的 HTML5 属性
【发布时间】:2016-10-10 05:21:39
【问题描述】:

我注意到 Firefox 中有一些非常奇怪的行为,我想知道是否有人制定了如何规范或解决这种行为的策略。

特别是如果您为 firefox 提供包含 html 实体的基本锚点,它将取消转义这些实体,无法重新转义它们并将您退回无效的 html。

例如,firefox 对以下 url 的处理不当:

<a href="><"">My Original Link</a>

如果这个 url 被 firefox 解析,它将取消 ><" 并开始处理如下的 url: <a href="<>"">My Original Link</a>

同样的操作似乎在其他地方也能正常工作,甚至是 safari 和 edge。

我尝试了很多不同的方式将 html 交给 firefox 以避免这个问题。尝试手动调用解析器,尝试设置 innerHTML,尝试 jQuery html(),尝试为 jQuery 构造函数提供一个巨大的字符串,等等。所有方法都产生了相同的错误结果。

在这里看一个小提琴: https://jsfiddle.net/kamelkev/hfd2b6sn/

我对这种处理方式似乎有多糟糕感到有些困惑。一定有办法解决这个问题,但我似乎找不到办法。

我的应用程序是一个 html 操作工具,因此我通常会通过下拉到 XML 并在保留到哑键值存储之前处理那里的问题来规范此类问题,但在这种特殊情况下,<> 字符是阻止我将此文档作为 XML 处理。

想法?

【问题讨论】:

    标签: javascript jquery html firefox


    【解决方案1】:

    <> 在属性值内有效,未转义。这不是最佳做法,但它是有效的。

    Firefox 正在解析原始 HTML 并从中生成元素。那时,原始的 HTML 不再存在。当你调用.outerHTML 时,HTML 是从元素中重构出来的。

    Firefox 然后使用与 Chrome 不同的一组规则生成它。

    不清楚您究竟需要这样做是为了什么...实际上您应该编辑 DOM 并在完成后导出整个 DOM 的 HTML。不需要不断地重新解释 HTML。

    【讨论】:

    • <> 内部属性值在 HTML 中有效,但在 XHTML 中无效。
    • @Oriol 是的,完全正确。问题是关于生成 HTML5。或者至少,这就是标题所暗示的。 :-)
    • 感谢您的评论。我一直认为在属性中使用未转义的 html 标记是无效的。由于我的应用程序完全基于浏览器,因此我有一个 html 规范化层(重写属性,使它们在所有浏览器中都相同),在存储之前需要通过 xml。正是在这一点上,我开始遇到问题。由于浏览器不合作,我无法将其规范化为 html。例如,IE 会始终将某些样式重写为速记样式,而不是保留提供的原始样式。
    • @kamelkev 我仍然不完全清楚你在做什么以及为什么。您正在制作某种所见即所得的 HTML 编辑器?还是其他某种 HTML 编辑器?为什么不构建和操作 DOM,然后导出生成的 XHTML?
    • 这实际上就是我所做的。我在 HTML5 中构建了一个文档,其中包含大量浏览器不一致,例如 firefox 的 <> 怪癖(原来 IE 也有),然后我导出到 XML,规范化并持久化它。在这种特殊情况下,我的问题是文档中存在的<> 阻止我将文档作为XML 处理。我现在所做的是使用正则表达式来转义这些字符,之后我的 XML 解析器可以处理文档。正则表达式显然不是一个好主意,但我没有看到替代方案。
    【解决方案2】:

    当解析器解析源代码以构造 DOM 时,>< 未转义。将元素序列化回字符串时,不能保证获得与源相同的文本。

    在这种情况下,innerHTMLouterHTML 使用HTML fragment serialization algorithm,其中escapes 属性值使用属性模式:

    转义字符串(出于上述算法的目的)包括 运行以下步骤:

    1. 用字符串“&”替换任何出现的“&”字符。

    2. 将所有出现的 U+00A0 NO-BREAK SPACE 字符替换为字符串“ ”。

    3. 如果算法是在属性模式中调用的,请将所有出现的“”字符替换为字符串“"”。

    4. 如果算法没有属性模式中被调用,用字符串“<”替换任何出现的“<”字符, 和任何 字符串“>”出现“>”字符。

    这就是为什么" 被转义为",但<> 仍然存在。

    这没关系,因为HTML double-quoted attribute values 中允许使用<>

    但是,XML 不允许在属性值中使用 <>。如果您想获得有效的 XHTML,请使用 XML 序列化程序:

    var s = new XMLSerializer();
    var str = s.serializeToString(document.querySelector('a'));
    console.log(str);
    <a href="><"">My Original Link</a>

    【讨论】:

    • 感谢您非常彻底的回答。不过,另一个人回答得稍微快了一点。我赞成您的回答,因为它肯定对其他人有用。
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多