Заполнение таблицы
Всем привет помогите реализовать заполнение таблицы. Уже который день сижу и ломаю голову как это сделать. С js знаком мало.
Проблема: В бд есть таблица содержащая занятые места в зале (ряд и место). Надо эти места взять и перенести на jsp-страницу. На jsp есть картинка со схемой зала. Поверх картинки рисуется таблица в ячейки которой вставляются картинки обозначающие занятое (красный крест) или свободное место (просто прозрачная картинка). В общем как уже говорил надо показать какие места заняты. Пытался сделать без js, но не получается позиционироваться в таблице. Поэтому прошу помощи тут. Вот пример того, как это должно выглядеть: ![]() |
а вопрос в чём?)
Цитата:
|
Цитата:
Я сейчас пытаюсь построить таблицу и заполнить её на основании вот этой статьи - https://developer.mozilla.org/en-US/...M_I nterfaces но что-то не получается сделать так, чтоб если место занято, то выдавало одно, а если свободно, то другое=( |
хороший пример по ссылке, а данные о том занято ли место у вас в каком виде
можете передать их в виде масива? например 0,0,0,1,1 0,1,1,0,1 |
Цитата:
Это же какой массив получится. уж слишком громадный Кстати как уже на jsp когда я пишу скрипт мне в него закинуть свою коллекцию? И как сделать так чтоб функция отрабатывала сразу же, а не по нажатию на кнопку (как примере по ссылке выше) |
так а что ты передаёшь в шаблон если не массив? приведи пару строк
чтоб отработала сразу - просто ставишь скрипт в конце страници, перед </body> |
Цитата:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="by.gsu.epamlab.Constants" %>
<%@page import="org.json.simple.JSONObject"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF8">
<title>Tickets ordered</title>
<script>
function generate_table(places){
var rows = 7;
var cells = 10;
var body = document.getElementsByTagName("body")[0];
var table = document.createElement("table");
var tableBody = document.createElement("tbody");
for (var j = 0; j < rows; j++) {
var row = document.createElement("tr");
for (var i = 0; i < cells; i++) {
var cell = document.createElement("td");
for (var p=0; p<places.size; p++) {
var cellText = document.createTextNode("Row: " + j + ", Place: " + i);
cell.appendChild(cellText);
row.appendChild(cell);
}
}
tableBody.appendChild(row);
}
table.appendChild(tableBody);
body.appendChild(table);
}
</script>
</head>
<body>
<c:if test="${not empty errorMessage}">
<c:out value="${errorMessage}"/>
<hr>
</c:if>
<%@ include file="header.jsp" %><br>
<%@ include file="headerOrder.jsp" %><br><br>
<c:choose>
<c:when test="${empty user}">
Your status Guest, please <a href="<c:url value='/login'/>">Sign in</a>. ${id}<br>
<img name = 'place' src = 'hallplan.jpg' />
</c:when>
<c:otherwise>
<c:set var="space" value=" "/>
<c:set var="cancel" value="<img src='cancel.png'>"/>
<c:set var="free" value="<img src='free.png'>"/>
There will be order ${user.name}<br>
<div style="background: url(hallplan.jpg) no-repeat top left;">
<br><br><br>
<div style="margin-left: 55px">
<input type="button" value="Generate a table." onclick="generate_table(${places})">
</div>
</div>
row place<br>
<c:forEach var="places" items="${places}">
${places.row} ${space} ${places.place}<br>
</c:forEach>
</c:otherwise>
</c:choose>
</body>
</html>
а передаю я коллекцию такой структуры: Код:
private int id; |
не всё понимаю в там коде, но попробуй так
замени циклы js на циклы jsp то есть перед </body> выводишь чтот типа
<script>
<c:forEach items="${row}">//перебираем ряды
var row = document.createElement("tr");
<c:forEach items="${place}">//перебираем ячейки
var cell = document.createElement("td");
var cellText = document.createTextNode(выводим значение занято/нет);
cell.appendChild(cellText);
row.appendChild(cell);
ну итд, по аналогии
|
Цитата:
<script>
function generate_table(){
var rows = 7;
var cells = 10;
var body = document.getElementsByTagName("body")[0];
var table = document.createElement("table");
var tableBody = document.createElement("tbody");
for (var j = 0; j < rows; j++) {
var row = document.createElement("tr");
for (var i = 0; i < cells; i++) {
var cell = document.createElement("td");
var cellText = document.createTextNode("Row: " + j + ", Place: " + i);
cell.appendChild(cellText);
row.appendChild(cell);
}
tableBody.appendChild(row);
}
table.appendChild(tableBody);
body.appendChild(table);
}
</script>
Стоит мне прописать что-то как уже таблицу не выводит Я не могу понять как мне внутри этого скрипта работать с коллекцией |
чёт я туплю под вечер. а зачем тебе аобще js там же всё в переменных шаблона есть
делай таблицу средствами jsp да и всё |
Цитата:
Если бы конечно вместо пустых мест к примеру стоят 0, то было бы проще, но опять же как отловить это в коллекции и вставить на нужные места 0, тоже не очень получается придумать=( |
делаешь 2 цикла по рядам и по местам
при выводе ячейки проверяешь занята ли она, у тебя есть номер ряда и номер места для этого |
Вложений: 1
Цитата:
И я хз какое условие вставить чтоб он поставило картинку, мол место занято. Вот примерно как это всё должно выглядеть, но в итоге если такое запустить, то получится как на картинке ниже. Хотя последнее место в первом ряду должно находится на месте №7, а не №5
<TABLE>
<tbody>
<c:forEach var="r" begin="1" end="7">
<TR>
<c:forEach var="p" begin="1" end="10">
<c:forEach var="places" items="${places}">
<c:if test="${places.place==p and places.row==r}">
<TD>${cancel}</TD>
</c:if>
</c:forEach>
</c:forEach>
</TR>
</c:forEach>
</tbody>
</TABLE>
Вот почти правильный цикл, но он оно отрабатывает больше чем надо=( и поэтому всё получается криво=(
<TABLE>
<tbody>
<c:forEach var="r" begin="1" end="7">
<TR>
<c:forEach var="p" begin="1" end="10">
<c:forEach var="places" items="${places}">
<c:choose>
<c:when test="${places.place==p and places.row==r}">
<TD>${cancel}</TD>
</c:when>
<c:otherwise>
<TD>${free}</TD>
</c:otherwise>
</c:choose>
</c:forEach>
</c:forEach>
</TR>
</c:forEach>
</tbody>
</TABLE>
|
один цикл должен быть по строкам (tr), внутри него второй цикл по ячейкам (td), любой другой цикл не должен добавлять не лишних td, не лишних tr
|
ладно, не мучайся, если не понял, о чём я: <td> должен быть непосредственно во втором по вложенности цикле, а само содержимое этого td выводиться в третьем по вложенности цикле
|
Спасибо всем, кто откликнулся и помог! Реализовал таки это штуку.
Теперь на повестке дня у меня другой вопрос. Как сделать так, что выбирая свободные места в зале, по нажатию на них, брался ряд и место? В данный момент я реализовал только по нажатию смену картинки. Подтолкните в какую сторону развивать идею, чтоб оно взяло значения [3,6] [3,7] [4,6] [4,7]. Потом эти значения надо будет передать в сервлет. |
|
Цитата:
вдобавок к посту animhotep, гугли event.target, тема заезженная |
Цитата:
Цитата:
В данный момент смена происходит по этому скрипту:
<script>
var x=false;
function imgchange(obj,imgX,imgY) {
if (x){
obj.src=imgX;
} else {
obj.src=imgY;
}
x=!x;
}
</script>
Но приходится почему-то нажимать не 1 раз, а 2 если выбираю другую картинку. По одной картинке всё нормально делает. Сейчас почитаю про event.target и буду думать как реализовать чтоб при выборе места создавало какое-либо скрытое поле и туда записывало ряд и место, а при снятии выделения убирало эту строку. |
Цитата:
|
Цитата:
<script>
var x=false;
function imgchange(obj) {
if (x){
obj.src="free.png";
} else {
obj.src="ok.png";
alert("Row is: "+ obj.parentNode.parentNode.rowIndex + "\nCell is: " + obj.parentNode.cellIndex);
}
x=!x;
}
</script>
Но вот почему-то баг с не однократным нажатием остался=( Из-за чего он может возникать? Для примера: [3,6] я выделяю 1 кликом, после чтоб выделить [3,7] мне надо будет нажать туда раза 2-3 и только после этого сработает смена картинки. Так же будет и с [4,6] и тд. Если я захочу снять выделение, то опять же надо будет нажать 2 раза на него. Однако стоит мне сначала выбрать [3,6] и потом снять с него выделение, то это всё происходит в 1 клик. А можно чуть подробнее про класс? Его в jsp оформлять? Я думал может быть можно как-либо в скрипт дописать ещё создание к примеру вот такой строки: <input type="hidden" value="Сюда вставлять данные о ряде и месте"> |
толком не знаешь нативный js, юзай jquery ;)
покликай на ячейках, потом возьмёшь данные из нужных ячеек и отошлёшь ajax-м
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
.green {
background-color: green;
}
td {
border: solid 1px;
}
</style>
<table class="table">
<tr>
<td>11</td>
<td>12</td>
</tr>
<tr>
<td>21</td>
<td>22</td>
</tr>
</table>
<script>
jQuery(function ($) {
$(".table").on("click", "td", function (e) {
$(e.target).toggleClass("green");
alert($(".green").size());
});
})
</script>
|
Цитата:
Код, который написали вы работает, но он отмечает всё подряд, а не только те места, которые свободны. И там меняется цвет, а мне бы хотелось чтоб менялось на картинку. Сейчас почитаю про Ajax |
Цитата:
поставь условие, чтобы занятые места не выбирались Цитата:
Цитата:
|
bes,
Я всё никак не могу понять как менять картинку при клике=( Я не могу понять как добраться до src у img. В данный момент я только дошёл до момента, когда получаю значения ряда и места, но мне кажется, что код не правильный=( Код:
jQuery(function ($) {
$(".table").on("click", "td", function (e) {
var $tar = $(e.target);
var $td = $tar.parents('td:first');
var $tr = $td.parents('tr:first');
var place = $tr.children().index($td);
var row = $tr.index();
var data = $td.html();
//if (???) { //тут в будущем будет условие при котором следует менять картинку
$tar.toggleClass("green");
alert($(".green").size() + "; Place = " + place + "; Row = " + row + "; Data = " + data);
//}
});
});
|
хотя бы так, если картинка фоном, если нет, получить ссылку на картинку -> изменить src
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
.green {
background: url("http://javascript.ru/forum/image.php?u=19820&dateline=1334914235");
}
td {
border: solid 1px;
width: 50;
height: 50;
background: url("http://javascript.ru/forum/images/ca_serenity/misc/logo.gif");
}
</style>
<table class="table">
<tr>
<td>11</td>
<td>12</td>
</tr>
<tr>
<td>21</td>
<td>22</td>
</tr>
</table>
<script>
jQuery(function ($) {
$(".table").on("click", "td", function (e) {
$(e.target).toggleClass("green");
alert($(this).text());
});
})
</script>
сделай тестовый пример, возможность запуска [html run] |
Вложений: 4
Вот сделал наконец. Теперь осталось
В данный момент я знаю, что данные добавляются в массивы, но почему-то не хотят оттуда удаляться=( Вот такой вид имеет сейчас код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF8">
<title>Tickets ordered</title>
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script>
var rows = [];
var places = [];
var count = 0;
jQuery(function ($) {
$(".table").on("click", "td", function (e) {
var $tar = $(e.target);
var $td = $tar.parents('td:first');
var $tr = $td.parents('tr:first');
var place = $tr.children().index($td);
var row = $tr.index();
var data = $td.children();
var srcImg = $tar.attr('src');
if (srcImg == "http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035"){
$tar.attr('src', 'http://javascript.ru/forum/attachment.php?attachmentid=1856&stc=1&d=1373743035');
rows[count] = row;
places[count]= place;
alert("Place = " + place + "; Row = " + row + "; Data = " + srcImg);
alert(rows[count] + "|" + places[count] + "|" + count);
count++;
}
if (srcImg == "http://javascript.ru/forum/attachment.php?attachmentid=1856&stc=1&d=1373743035"){
$tar.attr('src', 'http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035');
for (var i=0;i<rows.lenght;i++){
if (rows[i]==row && places[i]==place){
alert(rows[i] + "|" + places[i]);
rows[i]=null;
places[i]=null;
}
}
count--;
}
});
});
</script>
</head>
</html>
<body>
<form method="post" action="<c:url value='/order?idPlay=${idPlay}&idDate=${idDate}'/>">
<div style="background: url(http://javascript.ru/forum/attachment.php?attachmentid=1857&stc=1&d=1373742596) no-repeat top left;">
<br><br><br>
<div style="margin-left: 55px">
<TABLE class="table">
<TR>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1854&stc=1&d=1373743035'></TD>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035'></TD>
</TR>
<TR>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1854&stc=1&d=1373743035'></TD>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035'></TD>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035'></TD>
</TR>
<TR>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035'></TD>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1854&stc=1&d=1373743035'></TD>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035'></TD>
<TD><img src='http://javascript.ru/forum/attachment.php?attachmentid=1855&stc=1&d=1373743035'></TD>
</TR>
</TABLE>
</div>
</div>
<input type="submit" value="Ordered">
</form>
</body>
</html>
|
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<style>
.table {
background-color: rgb(250, 250, 250);
}
.table td {
border: outset 2px ;
min-width: 40px;
min-height: 40px;
}
.table td div {
text-align: right;
}
.table td div:first-child {
text-align: left;
}
.not-selectable {
background: url("http://javascript.ru/forum/attachment.php?attachmentid=1854&stc=1&d=1373743035") no-repeat center center;
}
.selected {
background: url("http://javascript.ru/forum/attachment.php?attachmentid=1856&stc=1&d=1373743035") no-repeat center center;
}
</style>
<button class="send">send</button>
<script>
jQuery(function ($) {
var str = "<table class=\"table\">";
for (var i = 1; i <= 7; i++) {
str += "<tr>";
for (var j = 1; j <= 10; j++) {
str += "<td><div>" + i + "</div><div>" + j + "</div></td>";
}
str += "</tr>";
}
str += "</table>";
$("body").prepend(str);
var table = $(".table").get(0);
table.rows[0].cells[0].className = "not-selectable";
table.rows[2].cells[3].className = "not-selectable";
table.rows[3].cells[5].className = "not-selectable";
$(".table").on("click", "td", function () {
if (this.className != "not-selectable") {
$(this).toggleClass("selected");
}
});
$(".send").on("click", function () {
var str="data=";
$.each($("td.selected"), function() {
str += this.parentNode.rowIndex + "," + this.cellIndex + ";";
});
alert(str);
$.ajax({
type: "POST",
url: "your.php",
data: str
});
});
});
</script>
|
bes,
Спасибо огромное, взял часть кода=) Но теперь не могу выловить в контроллере то, что отправил ajax В контроллере пишу пытаюсь принять данные так:
String str = request.getParameter("str");
и потом пытаюсь отправить эту строку на страницу так:
request.setAttribute("str", str);
и ничего не выводит=( |
параметр у меня назывался data
вывод в jsp: out.print(request.getParameter("data")); |
Цитата:
Я уже море информации перерыл, но всё никак не могу найти как отловить эти данные в контроллере=( |
Цитата:
обычный текст выводит? |
Цитата:
Вот, что получилось:
$(".send").on("click", function () {
var str="";
$.each($("td.selected"), function() {
str += this.parentNode.rowIndex + "," + this.cellIndex + ";";
});
if (str != ""){
alert(str);
var form = $('<form action="/jeeProject/ordercom"></form>');
$('<input type="hidden" />').attr({name: 'data', value: str}).appendTo(form);
form.appendTo(document.body);
form.submit();
} else {
alert("Please select place");
}
});
Я теперь могу нормально передавать в контроллер все нужные мне данные. В контроллере буду добавлять в базу данных новые значения. |
чем ajax не угодил
|
| Часовой пояс GMT +3, время: 04:49. |