当前位置: 代码迷 >> JavaScript >> 为什么在它之前附加带有空格或换行符的TR标记会导致它在tbody之外?
  详细解决方案

为什么在它之前附加带有空格或换行符的TR标记会导致它在tbody之外?

热度:72   发布时间:2023-06-12 13:46:07.0

我在通过JQuery向表中附加<tr>字符串标记时遇到了一种奇怪的行为。 每次我添加我生成为字符串的行时,它都被放在我的tbody之外。 然后我发现了这个问题。

如果我像这样追加它,它工作正常:

$("table").append("<tr><td>Test</td></tr>");

但是,如果我在<tr>之前添加一个空格或换行符,它会将该行追加到tbody之外。

$("table").append(" <tr><td>Test</td></tr>");
$("table").append("\n<tr><td>Test</td></tr>");

有趣的是,如果我使用任何其他角色,它仍然可以正常工作。 这种行为有什么特别的原因吗?

 //Works fine without anything before the tr $("table").append("<tr><td>Second row</td></tr>"); //Works fine also with any character $("table").append("sdfa<tr><td>Third row</td></tr>"); //Doesn't work when there's an whitespace or newline $("table").append(" <tr><td>Fourth row</td></tr>"); $("table").append("\\n<tr><td>Fifth row</td></tr>"); 
 table tbody td { color: red; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <table> <tr> <td>First row</td> </tr> </table> 

有一个在jQuery的,一个辅助工具manipulationTarget ,它确定target为,其中中添加字符串。 特别:

function manipulationTarget( elem, content ) {
    return jQuery.nodeName( elem, "table" ) &&
        jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?

        elem.getElementsByTagName("tbody")[0] ||
            elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
        elem;
}

当你在开头传入一个带有whitespace的字符串时会发生什么,它会创建一个文档片段,其中第一个子节点是text节点,而不是tr 在另一种实用方法中删除了乱码文本( sdfa )。

这种行为是根据jQuery文档

.append(内容[,内容])

content类型: htmlStringElementArrayjQuery DOM元素元素数组,HTML字符串或jQuery对象,用于插入匹配元素集中每个元素的末尾。

如果以<tag ... >开头,则将其标识为HTML