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

时间:2016-07-31 06:20:54

标签: javascript jsp scriplets

我试图在我的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文件中, 请帮助我,提前致谢。

2 个答案:

答案 0 :(得分:0)

正如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>

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

答案 1 :(得分:0)

要了解您的问题,您需要了解完成此操作的方法。

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

服务器端

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

在您的情况下,您的循环将插入

<script>
    drawFreeSlot();
</script>

对于电话号码为0的每个ParkingSlot(并增加变量)。

它还会将变量值插入到函数

<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>
...

只需对函数进行简单的更改即可使用此参数,您的代码也可以正常工作。

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