为什么jQuery解释破坏的标记与浏览器不同?

时间:2013-10-03 22:32:42

标签: javascript jquery html markup

我之前已回答this question,但我并不完全理解为什么答案是正确的。答案的要点:

<p id="jqrender"></p>

$(function() {
    $('#jqrender').html("<a href=http://www.website.com/>foo bar</a>");
});

在OSX上的最新Chrome上,jQuery将其解释为<a href="website.com"></a>foo bar。我认为这是有道理的,因为它认为最接近的标记修正是<a href="website" />。但在本地,Chrome本身会将标记解释为<a href="website.com/">foo bar</a>

为什么会这样?我想要一个技术答案,jQuery的哪个部分正在进行这个标记修复,它遵循的一般规则是什么,我怎么能猜出jQuery将如何反应其他破碎的标记?

1 个答案:

答案 0 :(得分:2)

jQuery源代码中的违规行在这里:https://github.com/jquery/jquery/blob/master/src/manipulation.js#L222

tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];

rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi elem是潜在破坏标记的片段。

对于该输入,replace调用的结果是<a href=http://www.website.com></a>foo bar</a>

然后,浏览器通过删除最终</a>来完成修复 标记的工作。

所以问题的另一点可以回答:这个特殊情况也会影响除area,br,col,embed,hr,img,input,link,meta和param之外的所有标签。

tl; dr:https://stackoverflow.com/a/1732454/1253312

相关问题