JavaScript在Firefox

时间:2016-10-08 02:04:35

标签: javascript jquery html html5 firefox

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

具体来说,如果你为firefox提供一个包含html实体的基本锚点,它将会忽略这些实体,无法重新转义它们并将你的无效html交给你。

例如,firefox错误处理了以下网址:

<a href="&gt;&lt;&quot;">My Original Link</a>

如果这个url被firefox解析,它会转发&gt;&lt;&quot;并开始处理一个url,如: <a href="<>"">My Original Link</a>

同样的操作似乎在其他地方工作得很好,甚至是野生动物园和边缘。

我尝试了几种不同的方式将html处理到firefox以避免这个问题。尝试手动调用解析器,尝试设置innerHTML,尝试jQuery html(),尝试给jQuery构造函数一个巨大的字符串,等等。所有方法产生相同的破坏结果。

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

我对这种处理方式的破坏感到有些迷惑。必须有办法解决这个问题,但我似乎找不到办法。

我的应用程序是一个html操作工具,所以我通常会通过下载到XML并在持久化到一个愚蠢的键值存储之前处理问题来规范这类问题,但在这种特殊情况下<>字符阻止我将此文档作为XML处理。

想法?

2 个答案:

答案 0 :(得分:1)

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

正在发生的事情是Firefox正在解析原始HTML并从中制作元素。此时,原始HTML不再存在。当您致电.outerHTML时,HTML将从元素重建。

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

目前还不清楚你究竟需要做什么...实际上你应该编辑DOM并在完成后导出整个DOM的HTML。不断重新解释HTML是不必要的。

答案 1 :(得分:1)

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

在这种情况下,innerHTMLouterHTML使用HTML fragment serialization algorithmescapes属性值使用属性模式:

  

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

     
      
  1. 替换&#34; &&#34;字符串&#34; &amp;&#34;。

  2.   
  3. 用字符串&#34; &nbsp;&#34;替换任何出现的U + 00A0 NO-BREAK SPACE字符。

  4.   
  5. 如果在属性模式中调用算法,则替换&#34;&#34;&#34;的所有出现。字符串&#34; &quot;&#34;。

  6.   
  7. 如果算法在属性模式调用,则替换&#34; <&#34;字符串&#34; &lt;&#34;以及任何字符   出现了&#34; >&#34;字符串&#34; &gt;&#34;。

  8.   

为什么"被转义为&quot;,但<>仍然存在。

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

  

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

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