【问题标题】:How to use onclick function to change ejs variable如何使用 onclick 函数更改 ejs 变量
【发布时间】:2025-10-05 08:45:01
【问题描述】:

我正在使用 Node、Express 和 ejs 创建一个 Web 应用程序。在同一页面上,我生成了一组按钮(下面的第一个表)和一组相应的隐藏divs(下面的第二个表)。单击按钮时,我想显示相应的div

<% for(var i = 0; i < stream.length; i++){ %>
<tr>
 <th scope="row"><%= stream[i].streamid %></th>
 <td><%= stream[i].streamname %></td>
 <td><%= stream[i].streamername %></td>
 <td> 
  <button
    class="btn btn-outline-success"
    data-toggle="modal"
    data-target="#streamDetailsModal"
    id="detailsstream"
    onclick="<% ctr = i %>"
  >
  Details
  </button>
 </td>
 <td>
  <a
   class="btn btn-outline-danger"
   href="/stream/delete/<%= stream[i].streamid %>"
  >
  ⊖ Remove
  </a>
 </td>
</tr>
<% } %>
<% for(var i = 0; i < stream.length; i++){ %>
<tr>
  <th scope="row"><%= stream[i].streamid %></th>
  <td><%= stream[i].streamname %></td>
  <td><%= stream[i].streamername %></td>
  <td>
   <button
    class="btn btn-outline-success"
    data-toggle="modal"
    data-target="#streamDetailsModal"
    id="detailsstream"
    data-ctr="<%= i %>"
   >
   Details
  </button>
 </td>
 <td>
  <a
   class="btn btn-outline-danger"
   href="/stream/delete/<%= stream[i].streamid %>"
  >
  ⊖ Remove
 </a>
</td>
</tr>
<% } %>

当用户单击第二个循环中的详细信息按钮时,我需要在第一个循环中更改计数器。

【问题讨论】:

  • 这里可能有一个误解——EJS运行在没有按钮的服务器上。它是一个生成 HTML 的预处理器。当代码在可以单击按钮的浏览器中运行时,EJS 代码不再存在。你能解释一下你想在这里完成什么吗?谢谢。
  • 我用一个循环来显示来自数据库的数据,每个数据库项目都有另一组数据链接到它。当用户从列表中单击特定项目时,我希望页面中的 div 仅显示链接到用户单击的特定项目的数据。我使用 ejs 循环显示这两个列表。
  • 需要在被点击的元素上存储它们之间的关系

标签: javascript node.js express ejs


【解决方案1】:

实现此类功能的正常方法是执行以下操作:

在您的第一个循环生成按钮中,为每个按钮添加一个处理程序,该处理程序显示具有一些唯一 ID 的 div(例如按钮 12 的 streamDetailsModal12);如果你使用引导程序或类似的东西,你甚至不必实现handler

  <button
    class="btn btn-outline-success"
    data-toggle="modal"
    data-target="#streamDetailsModal<% i %>"
    id="detailsstream"
    onclick="handler(event)"
  >

并为您希望在按钮上显示的每个 div 添加相应的 ID:

<div id="streamDetailsModal<% i %>"
> some content </div>

如果您自己实现 handler,则必须从 event.target 获取 id(这是您的按钮持有 data-target 属性和您想要的 id),然后找到元素并切换它的 display 属性或你想控制可见性的其他东西。

【讨论】:

    【解决方案2】:

    如果您确实希望使用上述逻辑...可能的方法是在按钮单击时进行服务器调用,计算服务器上的值并重新呈现页面 在前端。浏览器 Javascript 无法更改或操纵 ejs 逻辑或变量。这是在节点服务器上完成的。

    【讨论】:

    • 还有其他更好的方法吗?
    • 既然你想修改一个“ejs变量”......恐怕我们没有其他办法
    • 我做了一个解决方法,我只是使用 ejs 将所有 db 条目放在 html 页面中,并使用引导类来隐藏它们。使用 ejs 我给每一行一个单独的类名。在详细信息按钮中,我还匹配了一个 data-ctr 属性。每次用户单击详细信息按钮时。我使用 javascript onclick 事件并使用类名获得了“data-ctr”的值,我选择了适当的 tr 元素并使它们可见。