我在玩jQuery,我有个主意,所以我决定试试。

$('table').append('<thead><tr><th><th><th>');

你可以想象,这产生了:
table
-thead
--tr
---th
---th
---th

我知道您可以编写以下HTML并获得与上面相同的结构:
<table>
  <thead>
    <tr>
      <th>
      <th>
      <th>

我试图查看jQuery的源代码[1],但似乎没有任何东西表明jQuery对htmlString做了任何特殊的操作。jQuery只是将htmlString附加为一个普通字符串,让浏览器来完成这项工作,还是我遗漏了什么?
如果是浏览器起作用,这是否意味着我可以期望不同浏览器的不同行为?
[1]https://github.com/jquery/jquery/blob/0600a29256be76bd87adb547545bf7219fafb6ee/src/manipulation.js#L41

最佳答案

jQuery只是将htmlString附加为一个普通字符串,让浏览器来完成这项工作,还是我遗漏了什么?
是的,是的。:-)
jQuery允许浏览器做这项工作,但是它做了一些事情来帮助解决可能有问题的情况。例如:

var row = $("<tr><td>foo</td></tr>");

您可以在jQuery中这样做,然后返回一个jQuery对象,它包装一个DOM中还没有的行,DOM中有一个单元格。
这看起来很简单,但是jQuery必须确保在表的上下文中解析HTML字符串(因为如果您试图让浏览器在div中解析它,就有问题)。
编辑:Rob W指向some relevant source表示:
// We have to close these tags to support XHTML (#13200)
wrapMap = {

    // Support: IE 9
    option: [ 1, "<select multiple='multiple'>", "</select>" ],

    thead: [ 1, "<table>", "</table>" ],
    col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
    tr: [ 2, "<table><tbody>", "</tbody></table>" ],
    td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],

    _default: [ 0, "", "" ]
};

jQuery的内部buildFragment函数中的代码使用上面的映射(以及从中派生的对象)来确保正确解析HTML。

09-30 12:56
查看更多