EJS文件script标签内如何让循环变量i在<%= %>语法中生效?
问题原因
你遇到的问题本质是服务端EJS渲染和客户端JS执行的时序差异导致的:
- EJS的所有
<% %>相关语法都在服务端渲染阶段执行,此时客户端的JS代码还未运行,你代码中for循环里的i是客户端JS的变量,服务端渲染时无法识别这个值,自然不能正常解析。
解决方法
你可以先把服务端的classGroup.docs数组整体通过JSON序列化传递给客户端,之后直接在客户端JS中遍历该数组即可,修改后的代码如下:
<script> // 先将服务端的docs数组完整传递给客户端,使用<%- %>避免HTML转义破坏JSON格式 const docs = <%- JSON.stringify(classGroup.docs) %>; // 客户端侧直接遍历数组即可 for(let i = 0 ;i < docs.length;i++) { let chunk = docs[i].weight; console.log('weight : ' + chunk); } </script>
注意事项
- 序列化传递对象时必须使用
<%- %>而非<%= %>,后者会对输出内容做HTML转义,将JSON中的引号等字符转译为实体符,导致JSON格式失效。 - 如果你需要用到
classGroup的其他字段(比如totalDocs),也可以直接把整个classGroup对象序列化传递给客户端:const classGroup = <%- JSON.stringify(classGroup) %>;,后续就可以直接调用classGroup.totalDocs、classGroup.docs等属性。
内容的提问来源于stack exchange,提问作者shinbian11
相关产品推荐
相关产品推荐

