原因在于:
template()方法的返回值类型不同,导致后续的渲染方式不一样。
第一个template('usertpl', {data: response})返回的是一个字符串,包含tbody和tr、td等标签。
然后通过$('#userBox').html(html)将这个字符串作为HTML代码插入到userBox这个table中,相当于直接插入tbody。
第二个template('tp1', data)返回的可能是一个DocumentFragment对象,它不是一个完整的HTML字符串,需要附加到DOM树中。
所以不能直接插入innerHTML,需要先获取一个容器节点,然后使用 container.appendChild(template()) 将DocumentFragment对象附加上去。
两者返回值类型不同,所以渲染方式不一样。
如果想统一,可以考虑:
1. 都返回字符串,然后都用innerHTML插入
2. 都返回DocumentFragment,然后都用appendChild插入
3. 用JavaScript生成DOM节点,不使用template
4. 使用更高级的框架,比如Vue、React统一渲染方式
主要还是要注意template的返回值类型,然后选择合适的渲染方法,来实现不同情况下的统一。