我之前已回答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将如何反应其他破碎的标记?
答案 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之外的所有标签。