如何在外部脚本中访问 ejs 变量

nas*_*100 3 javascript ejs node.js

当我使用 NodeJS 将变量传递给我的 html 页面时,我可以使用内联脚本访问它,如下所示:

// passing myVar from the server
router.get('/', (req, res) => {
  res.render('index', { myVar: 'test'});
});

// access in index.ejs
<script>
  let myVar = <%- JSON.stringify(myVar) %>;
  alert(myVar);
</script>
Run Code Online (Sandbox Code Playgroud)

如果我尝试在这里使用外部脚本而不是内联脚本,我会遇到使用 ejs 语法的错误<%- %>。如何在外部脚本中访问 myVar?

Que*_*tin 7

<%-和之间的代码%>服务器端代码

如果将其从 EJS 模板文件中移到静态 JS 文件中,则无法获取数据。它不会被替换,您会将 EJS 模板发送到浏览器,而不是在服务器上对其进行处理以生成文档。

如果您将其移出生成 HTML 的 EJS 模板文件并移入生成 JavaScript 的不同 EJS 模板文件中,那么它将正常工作(除了在您的服务器端代码中它将具有不同的 URL 和不同的端点,因此您将需要移动填充您尝试访问的变量的服务器端代码)。

您有两个合理的选择:

有两个脚本元素。

获取页面数据的一种:

<script>let myVar = <%- JSON.stringify(myVar) %>;</script>
Run Code Online (Sandbox Code Playgroud)

还有一个包含 JavaScript 逻辑:

<script src="/js/logic.js"></script>
Run Code Online (Sandbox Code Playgroud)

将生成的数据移入页面

<div data-myVar="<%- JSON.stringify(myVar).replace(/"/g, "&quot;"); %>">...</div>
Run Code Online (Sandbox Code Playgroud)

... 然后通过 DOM 访问它。


小智 5

您可以将变量放在 data-value 中,以便在脚本中使用 js 或 jquery 获取,例如:

查看ejs端:

<div class='test' data-test-value='<%= JSON.stringify(myVar) %'></div>
Run Code Online (Sandbox Code Playgroud)

js脚本端:

-如果你使用jquery:

var $test = $('.test').attr('data-test-value')
  alert($test);
Run Code Online (Sandbox Code Playgroud)

-如果你使用 vanillaJs :

    var test = document.getElementsByClassName('test');
    var testValue = test[0].dataset.testValue;
    alert(testValue)
Run Code Online (Sandbox Code Playgroud)

如果语法错误,我不会测试我的普通脚本,请参阅文档