如何在Smarty模板的jQuery语句中按条件引入指定tpl文件
问题分析
- 你的现有写法存在两个核心逻辑错误:
- Smarty 是服务端模板引擎,所有
{include}类标签会在页面返回给客户端之前就完成渲染执行,无法等待客户端JS的判断结果再触发运行 - 你将代码包裹在
{literal}标签内,Smarty 会直接跳过解析该标签内所有{}包裹的语法,{include}本身就不会被处理
- Smarty 是服务端模板引擎,所有
正确实现方案
场景1:需引入的是Smarty模板片段(HTML内容)
提前让Smarty把目标模板渲染完成后暂存,JS判断条件满足后再插入到页面对应位置即可:
{* 预渲染目标模板,存为变量 *} {capture assign="mobileContent"} {include file="file.tpl"} {/capture} {literal} <script> if (window.matchMedia('(max-width: 767px)').matches) { // 条件满足时将预渲染的内容插入到页面,示例是插入到body末尾,可替换为你需要的容器 document.body.insertAdjacentHTML('beforeend', `{/literal}{$mobileContent|escape:'javascript'}{literal}`); } </script> {/literal}
注意必须给模板变量添加 escape:'javascript' 修饰,避免模板内的特殊字符破坏JS语法结构。
场景2:需引入的是JS/CSS静态资源文件
如果需要引入的不是模板片段,而是独立的静态资源,直接用JS动态加载即可,无需经过Smarty处理:
{literal} <script> if (window.matchMedia('(max-width: 767px)').matches) { // 动态加载JS文件示例 const script = document.createElement('script'); script.src = '你的目标JS文件路径'; document.head.appendChild(script); // 动态加载CSS文件示例 // const link = document.createElement('link'); // link.rel = 'stylesheet'; // link.href = '你的目标CSS文件路径'; // document.head.appendChild(link); } </script> {/literal}
内容的提问来源于stack exchange,提问作者ayaashraf
相关产品推荐
相关产品推荐

