2016-07-31 26 views
0

蔭試圖在我的javascript函數訪問scriplet變量,但如預期我沒有得到resul, 這裏是我的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

您必須考慮如何呈現JSP代碼。如果您在瀏覽器中查看頁面源代碼,您可能會看到發生了什麼情況:假設'drawFreeSlot()'定義了一次,它將'var slotNo'設置爲當前的<%= slotCount%>'它不會神奇地更新,因爲你有一個JSP循環輸出多個調用到'drawFreeSlot()'。 – nnnnnn

+0

當循環迭代時,slotCount變量會採用新值,然後在我的JavaScript代碼中,我只能訪問該值> – user6654733

+0

您是對的nnnnnn,但我的slotCount始終爲0 ..您能告訴我嗎? – user6654733

回答

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()塊,他都會執行該函數,但該函數當時只具有變量插入的值,這是您的問題所在。

解決方案

由於NNNNNN建議它,使用參數將解決這個問題掠過。

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

的HTML頁面看起來像:

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

只是在函數的簡單改變與該參數的工作是需要和你的代碼將工作。

由於在每個循環中,您在此時打印此變量的值。

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> 

用你的替代我的存根清單和條件語句,它應該RK。