我试图在我的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文件中, 请帮助我,提前致谢。
答案 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>
...
只需对函数进行简单的更改即可使用此参数,您的代码也可以正常工作。
因为在每个循环中,您将在变量的此时打印该值。