3

我以前回答过这个问题,但我不完全明白为什么答案是正确的。答案的要点:

<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 将如何对其他损坏的标记做出反应?

4

1 回答 1

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;博士:https ://stackoverflow.com/a/1732454/1253312

于 2013-10-03T22:45:18.907 回答