无法访问我的 javascript 中的 scriplet 变量

Unable to access scriplet variable in my javascript

我试图在我的 javascript 函数中访问一个 scriplet 变量,但我没有得到预期的结果, 这是我的 javascript,

<script language="javascript">
function drawFreeSlot(){
    var div = document.createElement('div');
     var slotNo = <%=slotCount%>;
    div.className = 'col-1';
    //div.appendChild("Slot"+slotNo);
    div.style.backgroundColor = 'lightgreen';
    document.getElementById('content').appendChild(div);
</script>

我的 scriplet 代码为,

<%!int slotCount = 0; %>
<%for(ParkingSlot slot:slotList){
 if(slot.getPhoneNo() == 0){
 slotCount++;%>
 <script>
 drawFreeSlot();

 </script>
<%
 }%>

两个代码都在同一个 jsp 文件中, 请帮助我,提前致谢。

正如 nnnnnn 指出的那样,var slotNo = <%=slotCount%> 只会设置 slotNo 一次,然后不会像您期望的那样更新。 相反,将参数传递给函数,以便函数范围内 slotCount 的值将取决于每个函数调用。

function drawFreeSlot(slotCount) {
  var div = document.createElement('div');
  div.className = 'col-1';
  div.appendChild("Slot" + slotCount);
  div.style.backgroundColor = 'lightgreen';
  document.getElementById('content').appendChild(div);
  var sc = slotCount;
}

解决方案 1:不会在每次新请求时刷新 slotCount

<%!
   int slotCount = 0;
   List<String> mylist = Arrays.asList("A", "B", "C", "ABC", "DEF");
%>
<%
  for (String str: mylist) {
    if(str.length() < 3) { %>
      <script>drawFreeSlot(<%=++slotCount%>);</script>
<%  }
  } %>

解决方案 2:使用 JSTL(将在每个新请求上刷新 slotCount

<% request.setAttribute("mylist", mylist); %>
<c:set var="slotCount" value="0"/>
<c:forEach var="str" items="${mylist}">
  <c:if test="${str.length() < 3}">
    <c:set var="slotCount" value="${slotCount+1}"/>
    <script>drawFreeSlot(${slotCount});</script>
  </c:if>
</c:forEach>

用你的替换我的存根列表和条件语句,它应该可以工作。

要了解您的问题,您需要一些有关完成方法的信息。

您在代码中使用了两个不同的方面。服务器端的 scriplet 和客户端的 javascript,首先执行 scriplet 然后将结果发送到浏览器以执行 javascript.

服务器端

首先要了解的是 Scriplet 不会执行 Javascript 代码。 JSP 基本上会在文件中添加一些文本。

在你的例子中,你的循环将插入

<script>
    drawFreeSlot();
</script>

对于每个 phone 数字为 0 的停车位。(并递增变量)。

它还会将变量值插入函数

<script language="javascript">
function drawFreeSlot(){
    var div = document.createElement('div');
     var slotNo = <%=slotCount%>;
    div.className = 'col-1';
    //div.appendChild("Slot"+slotNo);
    div.style.backgroundColor = 'lightgreen';
    document.getElementById('content').appendChild(div);
</script>

值取决于这段代码的位置,如果在循环之后,你会有槽的数量,如果不是,它将是0。它不使用变量,只是插入值作为文本。

客户端

完成后,页面将被发送到客户端浏览器并接收带有这些脚本块的 HTML 页面。

浏览器将读取文件以显示结果。这是执行 Javascript 的时候。所以每找到一个drawFreeSlot()块,他就会执行函数,但是函数当时只有变量insert的值,这就是你的问题所在。

解决方案

正如nnnnnn所建议的,使用参数传递将解决问题。

<script>drawFreeSlot(<%=++slotCount%>);</script>

HTML 页面将如下所示:

...
<script>
    drawFreeSlot(1);
</script>
...
<script>
    drawFreeSlot(2);
</script>
...
<script>
    drawFreeSlot(3);
</script>
...

只需简单更改函数即可使用此参数,您的代码即可正常运行。

因为在每个循环中,您都会打印变量此时的值。