Html 模板标签搞砸了车把标签

问题描述

这是我的 html,具有 “现代” Web 组件模板:

<html dir="ltr" lang="en-US">   
    <body>                  
                <template>                  
                    <table>
                        {{#each items}}
                        <tr>                            
                            <td>
                                {{email}}
                            </td>                           
                            <td>
                                {{phone}}
                            </td>                           
                        </tr>
                        {{/each}}
                    </table>                    
                </template>
    </body> 
</html>

这是我在浏览器(Chrome 和 Firefox)中得到的:

<html dir="ltr" lang="en-US"><head></head><body>                    
                <template>                  
                    
                        {{#each items}}
                        
                        {{/each}}
                    <table><tbody><tr>                          
                            <td>
                                {{email}}
                            </td>                           
                            <td>
                                {{phone}}
                            </td>                           
                        </tr></tbody></table>                   
                </template>
        




</body></html>

很明显,车把卷曲标签被吊到顶部。模板不应该保持内部数据完整以备将来渲染吗?那么我们是否只有使用 <script type="shame-on-html"> 而不是直观的 <template> 的唯一选择?

(请忽略这一行:浏览器何时会更多地支持动态网页内容,React 的统治何时结束?)

解决方法

template 标签内容不会被浏览器忽略。

将模板视为存储在文档中供后续使用的内容片段。虽然解析器在加载页面时会处理元素的内容,但它这样做只是为了确保这些内容是有效的;但是,不会呈现元素的内容。

MDN

所以内容被解析和验证。 table 元素具有 permitted content 的特定列表和顺序。因此,当解析 template 内容时,将从 table 中删除不受支持的内容。

如果您在表格中使用 p 标签,您会看到相同的行为。

<template>                  
    <table>
        <p>
        <tr>                            
            <td>
                {{email}}
            </td>                           
            <td>
                {{phone}}
            </td>                           
        </tr>
        </p>
    </table>                    
</template>

另一种方法是将模板存储在 JavaScript 中,并在将其插入 DOM 之前使用 Handlebars 对其进行处理。

<script>                  
    const template = `<table>
        {{#each items}}
        <tr>                            
            <td>
                {{email}}
            </td>                           
            <td>
                {{phone}}
            </td>                           
        </tr>
        {{/each}}
    </table>`;
</script>