2016-07-31 3 views
0

Iam пытается получить доступ к скриптлету переменного в моем яваскрипте функции, но я не получаю Ресул, как и ожидался, вот мой JavaScript,Невозможно получить доступ к скриптлету переменного в моей 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> 

и мой скриптлета код, как ,

<%!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

Чтобы понять вашу проблему, вам понадобится информация о том, как это делается.

В вашем коде работают две разные стороны. Сценарий на стороне сервера и javascript на стороне клиента. Сначала выполняется сценарий, затем результат отправляется в браузер для выполнения javascript.

стороне сервера

Первое, что нужно понять, что скриптлета не выполнит Javascript код. JSP будет в основном добавлять текст в файл.

В вашем случае, ваш цикл будет вставить

<script> 
    drawFreeSlot(); 
</script> 

Для каждого ParkingSlot с номером телефона на 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> 
... 

Простое изменение функции для работы с этим параметром является потребность и ваш код будет работать.

Поскольку на каждом цикле вы печатаете значение в это время вашей переменной.

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> 

Замените мой список заглушек и условие с вашим, и он должен wo гк.

Смежные вопросы