我注意到firefox中有一些非常奇怪的行为,我想知道是否有人制定了如何规范化或解决此问题的策略。
具体来说,如果你为firefox提供一个包含html实体的基本锚点,它将会忽略这些实体,无法重新转义它们并将你的无效html交给你。
例如,firefox错误处理了以下网址:
<a href="><"">My Original Link</a>
如果这个url被firefox解析,它会转发><"
并开始处理一个url,如:
<a href="<>"">My Original Link</a>
同样的操作似乎在其他地方工作得很好,甚至是野生动物园和边缘。
我尝试了几种不同的方式将html处理到firefox以避免这个问题。尝试手动调用解析器,尝试设置innerHTML,尝试jQuery html(),尝试给jQuery构造函数一个巨大的字符串,等等。所有方法产生相同的破坏结果。
在这里看一个小提琴: https://jsfiddle.net/kamelkev/hfd2b6sn/
我对这种处理方式的破坏感到有些迷惑。必须有办法解决这个问题,但我似乎找不到办法。
我的应用程序是一个html操作工具,所以我通常会通过下载到XML并在持久化到一个愚蠢的键值存储之前处理问题来规范这类问题,但在这种特殊情况下<>
字符阻止我将此文档作为XML处理。
想法?
答案 0 :(得分:1)
<
或>
在未转义的属性值内有效。这不是最佳做法,但它是有效的。
正在发生的事情是Firefox正在解析原始HTML并从中制作元素。此时,原始HTML不再存在。当您致电.outerHTML
时,HTML将从元素重建。
目前还不清楚你究竟需要做什么...实际上你应该编辑DOM并在完成后导出整个DOM的HTML。不断重新解释HTML是不必要的。
答案 1 :(得分:1)
当解析器解析源以构造DOM时,>
和<
未转义。将元素序列化回字符串时,不能保证获得与源相同的文本。
在这种情况下,innerHTML
和outerHTML
使用HTML fragment serialization algorithm,escapes属性值使用属性模式:
转义字符串(出于上述算法的目的)包括 运行以下步骤:
替换&#34;
&
&#34;字符串&#34;&
&#34;。用字符串&#34;
&#34;替换任何出现的U + 00A0 NO-BREAK SPACE字符。如果在属性模式中调用算法,则替换&#34;&#34;&#34;的所有出现。字符串&#34;
"
&#34;。- 醇>
如果算法在属性模式中未调用,则替换&#34;
<
&#34;字符串&#34;<
&#34;以及任何字符 出现了&#34;>
&#34;字符串&#34;>
&#34;。
为什么"
被转义为"
,但<
和>
仍然存在。
这没关系,因为HTML double-quoted attribute values允许<
和>
:
- U + 0022报价标记(&#34;):切换到after attribute value (quoted) state。
- U + 0026 AMPERSAND(&amp;):切换到character reference in attribute value state [...]
- U + 0000 NULL:Parse error [...]
- EOF:Parse error [...]
- 其他:将current input character附加到当前属性的值。
但是,XML不允许在属性值中使用<
和>
。如果要获得有效的XHTML,请使用XML序列化程序:
var s = new XMLSerializer();
var str = s.serializeToString(document.querySelector('a'));
console.log(str);
&#13;
<a href="><"">My Original Link</a>
&#13;