Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Формы, динамическая таблица (https://javascript.ru/forum/dom-window/55035-formy-dinamicheskaya-tablica.html)

|Alexxx|# 10.04.2015 22:53

Формы, динамическая таблица
 
Доброго времени суток. Помогите советом новичку (чем пользоваться, где найти).
Допустим, у меня есть электронная библиотека для которой нужно создать список читателей. При входе на хтмл страницу появляется форма для заполнения (id, имя, время регистрации и т.д.). На этой же странице размещается сама таблица, которую нужно привязать к форме заполнения, то есть, заполнив все поля и нажав на кнопку "добавить читателя" таблица автоматически обновляется и добавляет нового пользователя, и т.д.

Я немного в замешательстве. Буду благодарен любым советам/ответам.
Спасибо.

theKingOfJava 10.04.2015 23:32

сделать то это не трудно
<html>
<head>
</head>

<body>

<input id="userName" />
<input id="userId" />
<input id="regTime" />
<button id="b">add</button>
<table id="t" style="border: 1px solid black">
<tr>
<td>username</td>
<td>userid</td>
<td>regtime</td>
</tr>
</table>

<script>

b.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=userName.value
 row.insertCell().innerHTML=userId.value
 row.insertCell().innerHTML=regTime.value
}



</script>

</body>
</html>

Только вот зачем? Данные то все равно сохрантяь где то надо. Не проще ли сразу слать на сервер?

|Alexxx|# 11.04.2015 00:06

Спасибо за ответ.
Хочу все делать поэтапно, начиная с малого.

Можно еще вопрос: к примеру, если мне понадобится кнопочка для генерации id пользователя в каких-то пределах (скажем, по ее нажатию новый читатель получит случайный идентификатор в диапазоне 0-20).
С помощью чего это сделать: есть, например, function random для генерации случайного числа, а как ее "впихнуть" в кнопку?

Может мои вопросы и покажутся кому-то слишком простыми и даже глупыми, но не судите строго - только начинаю осваивать язык.

theKingOfJava 11.04.2015 00:26

<html>
<head>
</head>
 
<body>
 
<input id="userName" />
<input id="userId" />
<input id="regTime" />
<button id="b">add</button>
<button id="gen">generate id</button>
<table id="t" style="border: 1px solid black">
<tr>
<td>username</td>
<td>userid</td>
<td>regtime</td>
</tr>
</table>
 
<script>

gen.onclick=function(){
 userId.value=Math.floor(Math.random()*20)
}
 
b.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=userName.value
 row.insertCell().innerHTML=userId.value
 row.insertCell().innerHTML=regTime.value
}
 
 
 
</script>
 
</body>
</html>

UPD Только id в диапазоне 20 -- это туфта. В норме генератор должен порождать гарантированно уникальные номера. Проще всего это реализовать итератором. Random тут не при чем.

kostyanet 11.04.2015 06:28

Цитата:

Сообщение от |Alexxx|#
Хочу все делать поэтапно, начиная с малого.

Этапы

1) таблица в бд на сервере
2) вывод таблицы из бд на сервере
3) ввод в таблицу в бд на сервере
4) пункт 2 и 3 через аякс

|Alexxx|# 11.04.2015 09:26

Спасибо за ответы, буду разбираться.

|Alexxx|# 12.04.2015 20:03

Доброго времени суток. Получается примерно такая картина. В основном вышло, что хотел. Но есть еще пару вопросов, в частности по датам:
Хочу сделать, чтобы поле Registration содержало три элемента, представляющие дату регистрации: текстовое поле числа месяца, список с месяцами и список годов, скажем, в диапазоне +-10 лет от текущего года (соответственно, чтобы информация заносилась в таблицу аналогичным образом).
Сделать все по отдельности не составляет проблем, загвоздка в том, чтобы эти элементы "связать" и выносить в табличку, как и остальные.

Как это лучше сделать? Буду благодарен любым ответам/советам.



<html>
<head>
</head>
<body>

<p><table id="t" width="1250" cellspacing="1" cellpadding="2" style="border: 1px solid black"> 
<tr>
<td>ID</td>
<td>Full Name</td>
<td>Reading Hall</td>
<td>Registration</td>
<td>Expiration Date</td>
<td>Period</td>
</tr>
</table></p>

<fieldset>
<legend>New Reader</legend> <label>Reader`s ID</label> <input id="ID"/> <button id="gen">generate id</button>
<p><label>Full Name</label> <input id="fullName" /></p>
<label>Reading Hall</label> <select id="RH">
<option>Financial</option>
<option>Computers/IT</option>
<option>Science Fiction</option>
<option selected>--Select reading hall--</option>
</select>
<p><label>Registration</label> <input id="Registration"/></p>
<p> <button id="b">Add reader to table</button></p>
</fieldset>


<script>
gen.onclick=function(){
ID.value=Math.floor(Math.random()*20)
}

b.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=ID.value
 row.insertCell().innerHTML=fullName.value
 row.insertCell().innerHTML=RH.value
 row.insertCell().innerHTML=Registration.value
}
</script>
</body>

</html>

Царь Леонид 13.04.2015 08:51

То,что вы сделали не несет никакого практического применения, все данные в вашей табличке на сервере не сохраняются и перезагрузке страницы удалются

theKingOfJava 13.04.2015 09:34

Если я правильно понял
<html>
<head>
</head>
<body>
 
<p><table id="t" width="1250" cellspacing="1" cellpadding="2" style="border: 1px solid black">
<tr>
<td>ID</td>
<td>Full Name</td>
<td>Reading Hall</td>
<td>Registration</td>
<td>Expiration Date</td>
<td>Period</td>
</tr>
</table></p>
 
<fieldset>
<legend>New Reader</legend> <label>Reader`s ID</label> <input id="ID"/> <button id="gen">generate id</button>
<p><label>Full Name</label> <input id="fullName" /></p>
<label>Reading Hall</label> <select id="RH">
<option>Financial</option>
<option>Computers/IT</option>
<option>Science Fiction</option>
<option selected>--Select reading hall--</option>
</select>
<p><label>Registration date</label> <input id="Registration_date"/></p>
<p><label>Registration month</label> <select id="Registration_month"><option>01</option><option>02</option></select> </p>
<p><label>Registration year</label> <select id="Registration_year"><option>2000</option><option>2001</option></select> </p>
<p> <button id="b">Add reader to table</button></p>
</fieldset>
 
 
<script>
gen.onclick=function(){
ID.value=Math.floor(Math.random()*20)
}
 
b.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=ID.value
 row.insertCell().innerHTML=fullName.value
 row.insertCell().innerHTML=RH.value
 row.insertCell().innerHTML=Registration_date.value+" "+Registration_month.value+" "+Registration_year.value
}
</script>
</body>
 
</html>

|Alexxx|# 13.04.2015 13:33

Царь Леонид,
Я понимаю, но это скорее задание "для себя". Просто придумал задачку и захотел ее решить. Но все же спасибо за ответ.

|Alexxx|# 13.04.2015 13:37

theKingOfJava,
Да, что-то похожее на это. Не думал, что так просто это можно сделать.
Спасибо за ответ.

|Alexxx|# 13.04.2015 16:02

Yuliya1121,
Все будем миллионерами.

|Alexxx|# 13.04.2015 17:17

theKingOfJava,
Вопрос: можно на html страничке выпадающий список максимально сократить (убрать option), задав в javascript массив элементов списка и "привязав" его к select?

К примеру, создать скрипт, где все option будут объявлены в одной новой переменной?

theKingOfJava 13.04.2015 18:37

<html>
<head>
</head>
<body>
 
<select id="s"></select>
 
<script>

opts=[1,2,3,5]
opts.forEach(function(x){s.appendChild(new Option(x))})

</script>
</body>
 
</html>

|Alexxx|# 13.04.2015 18:42

Огромное спасибо)

|Alexxx|# 14.04.2015 19:27

Доброго времени суток, уважаемые программисты. К вам есть очередной вопрос: есть следующий код, работает все как хотел. Но появилась еще одна мысль, реализовать которую не хватает ума. Скажем, добавили мы нового пользователя, указали дату регистрации и ее окончания.

Можно ли в последнюю колонку "Period" вывести, скажем, значок решетки, при нажатии на которую появится всплывающее окошко (alert), где будет указано количество дней, оставшихся до окончания регистрации выбранного пользователя. Другими словами, от значения Expiration будет отниматься Registration, и на выходе мы получим определенное количество дней.

Просто объявить переменные и отнимать от одной другую - глупая идея, и ничего здесь не выйдет (может я ошибаюсь, но вряд ли). Мне кажется, с этим кодом это сделать не выйдет, т.к. яваскрипт вряд ли вобще понимает, что в наших ячейках есть даты..

<html>
<head>
</head>
<body>
  
<p><table id="t" width="1250" cellspacing="1" cellpadding="2" style="border: 1px solid black">
<tr>
<td>ID</td>
<td>Full Name</td>
<td>Reading Hall</td>
<td>Registration</td>
<td>Expiration Date</td>
<td>Period</td>
</tr>
</table></p>

<fieldset>
<legend>New Reader</legend> <label>Reader`s ID</label> <input id="ID"/> <button id="genID">generate id</button>
<p><label>Full Name</label> <input id="fullName" /></p>
<label>Reading Hall</label> <select id="RH">
<option>Financial</option>
<option>Computers/IT</option>
<option>Science Fiction</option>
<option selected>--Select reading hall--</option>
</select>

<p><label>Registration date</label> <input id="D"/> <select id="M"></select> <select id="Y"></select> </p>
<p><label>Expiration date</label> <input id="D2"/> <select id="M2"></select> <select id="Y2"></select> </p>
<p> <button id="AddReader">Add reader to table</button></p>
</fieldset>

<script>

genID.onclick=function(){
ID.value=Math.floor(Math.random()*20)
}
  
AddReader.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=ID.value
 row.insertCell().innerHTML=fullName.value
 row.insertCell().innerHTML=RH.value
 row.insertCell().innerHTML=D.value+" "+M.value+" "+Y.value
 row.insertCell().innerHTML=D2.value+" "+M2.value+" "+Y2.value

}

opts1=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
opts1.forEach(function(x){M.appendChild(new Option(x))})

opts2=["2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025"]
opts2.forEach(function(z){Y.appendChild(new Option(z))})

opts1_2=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
opts1_2.forEach(function(x){M2.appendChild(new Option(x))})

opts2_2=["2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025"]
opts2_2.forEach(function(k){Y2.appendChild(new Option(k))})

</script>

</body>

</html>

laimas 14.04.2015 20:35

Сервер хранит регистрацию, так что ему трудно выдать готовое - количество дней ее окончания? И это можно получить уже sql-запросом.
А уж как показать, сразу ли, или в окошечке, это как нравится. Зачем возлагать на клиента задачи, которые не имеют смысла?

|Alexxx|# 14.04.2015 21:49

Это задачка скорее для общего развития, не более. На практике этот код вряд ли будет где-то использоваться.
Изучаю html, js, css несколько недель, следовательно, знаний не очень много.

Было бы очень интересно посмотреть, как приведенную выше задумку можно реализовать.
Буду благодарен за любые советы/ответы.

laimas 15.04.2015 03:17

Понятно. Ну так решать задачи нужно привязанные к реалиям, а не нечто пространное. Сервер будет хранить дату регистрации как DATETIME. Окончании регистрации при этом хранить не нужно серверу, ему необходимо в таком случае хранить установленный период в днях. По этим двум параметрам можно получить и дату окончания, и проверить скоро ли она наступит, и отправить письмо пользователю за день до ее окончания. Для этого и SQL, и серверный язык имеют набор функций для работы с датой/временем.

JS не исключение, в нем тоже есть инструментарий для подобных операций - объект Date. В реальности сервер вернул бы дату регистрации и ее период определенный конфигураций, а никак не набор месяцев и годов как у вас представлено. Посредством объекта Date и нужно производить расчет на клиенте.

Но данные типа дата/время, это особый тип, который еще связан и с пространством даже а рамках шарика нашего. Сайт будет работать по времени сервера для всех пользователей, включая и тех кто западнее его, и кто восточнее. Если клиенту передать время регистрации, которое соответствует времени сервера, то расчеты на клиенте будут верны только для тех пользователей, у которых часовой пояс равен поясу определенному для сервера. А для клиентов со смещением от него будет ошибка, и чем далее смещение, тем грубее ошибка, в смысле рассчитанного периода.

Чтобы этой ошибки не возникало, клиент должен производить расчеты по времени клиента, а сервер для этого должен отдавать клиенту не локальное время регистрации, а ее UTC представление. Есть еще один способ, это передача клиенту времени регистрации по локальному времени сервера и смещение временной зоны сервера (от GMT). У сервера смещение к западу будет отрицательными, а к востоку положительными, на клиенте наоборот - к востоку отрицательные, к западу положительные. Разница смещения сервера и клиента позволит получить на клиенте как локальное время, так и отображать время и сервера.

Вот такие задачи решать, и не с абстрактными цифрами напоминающими год, а с временными метками и посредством объекта Date, это была бы польза. А набор цифр и названий месяцев, было бы уместно для задачи "Календарь", хотя и для него нужны были бы только названия месяцев, для локализации.

theKingOfJava 15.04.2015 17:59

<html>
<head>
</head>
<body>
   
<p><table id="t" width="1250" cellspacing="1" cellpadding="2" style="border: 1px solid black">
<tr>
<td>ID</td>
<td>Full Name</td>
<td>Reading Hall</td>
<td>Registration</td>
<td>Expiration Date</td>
<td>Period</td>
</tr>
</table></p>
 
<fieldset>
<legend>New Reader</legend> <label>Reader`s ID</label> <input id="ID"/> <button id="genID">generate id</button>
<p><label>Full Name</label> <input id="fullName" /></p>
<label>Reading Hall</label> <select id="RH">
<option>Financial</option>
<option>Computers/IT</option>
<option>Science Fiction</option>
<option selected>--Select reading hall--</option>
</select>
 
<p><label>Registration date</label> <input id="D"/> <select id="M"></select> <select id="Y"></select> </p>
<p><label>Expiration date</label> <input id="D2"/> <select id="M2"></select> <select id="Y2"></select> </p>
<p> <button id="AddReader">Add reader to table</button></p>
</fieldset>
 
<script>
 
genID.onclick=function(){
ID.value=Math.floor(Math.random()*20)
}
AddReader.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=ID.value
 row.insertCell().innerHTML=fullName.value
 row.insertCell().innerHTML=RH.value
 var r_date=D.value, r_month=M.value, r_year=Y.value, e_date=D2.value, e_month=M2.value, e_year=Y2.value
 row.insertCell().innerHTML=r_date+" "+r_month+" "+r_year
 row.insertCell().innerHTML=e_date+" "+e_month+" "+e_year
 var per=row.insertCell()
 per.innerHTML="#"
 var regDate=new Date(r_year, opts1.indexOf(r_month), r_date).getTime(),
     expDate=new Date(e_year, opts1.indexOf(e_month), e_date).getTime(),
     theTime=(expDate-regDate)/86400000
 per.onclick=function(){alert(theTime)}
}
 
opts1=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
opts1.forEach(function(x){M.appendChild(new Option(x))})
 
opts2=["2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025"]
opts2.forEach(function(z){Y.appendChild(new Option(z))})
 
opts1_2=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
opts1_2.forEach(function(x){M2.appendChild(new Option(x))})
 
opts2_2=["2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025"]
opts2_2.forEach(function(k){Y2.appendChild(new Option(k))})

 
</script>
 
</body>
 
</html>

theKingOfJava 15.04.2015 20:03

<html>
<head>
</head>
<body>
    
<p><table id="t" width="1250" cellspacing="1" cellpadding="2" style="border: 1px solid black">
<tr>
<td>ID</td>
<td>Full Name</td>
<td>Reading Hall</td>
<td>Registration</td>
<td>Expiration Date</td>
<td>Period</td>
</tr>
</table></p>
  
<fieldset>
<legend>New Reader</legend> <label>Reader`s ID</label> <input id="ID"/> <button id="genID">generate id</button>
<p><label>Full Name</label> <input id="fullName" /></p>
<label>Reading Hall</label> <select id="RH">
<option>Financial</option>
<option>Computers/IT</option>
<option>Science Fiction</option>
<option selected>--Select reading hall--</option>
</select>
  
<p><label>Registration date</label> <input id="D"/> <select id="M"></select> <select id="Y"></select> </p>
<p><label>Expiration date</label> <input id="D2"/> <select id="M2"></select> <select id="Y2"></select> </p>
<p> <button id="AddReader">Add reader to table</button></p>
</fieldset>
  
<script>
  
genID.onclick=function(){
ID.value=Math.floor(Math.random()*20)
}
AddReader.onclick=function(){
 var row=t.insertRow()
 row.insertCell().innerHTML=ID.value
 row.insertCell().innerHTML=fullName.value
 row.insertCell().innerHTML=RH.value
 var r_date=D.value, r_month=M.value, r_year=Y.value, e_date=D2.value, e_month=M2.value, e_year=Y2.value
 row.insertCell().innerHTML=r_date+" "+r_month+" "+r_year
 row.insertCell().innerHTML=e_date+" "+e_month+" "+e_year
 var per=row.insertCell()
 per.innerHTML="#"
 var expDate=new Date(e_year, opts1.indexOf(e_month), e_date).getTime()
 per.onclick=function(){alert(Math.floor((expDate-Date.now())/86400000))}
}
  
opts1=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
opts1.forEach(function(x){M.appendChild(new Option(x))})
  
opts2=["2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025"]
opts2.forEach(function(z){Y.appendChild(new Option(z))})
  
opts1_2=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
opts1_2.forEach(function(x){M2.appendChild(new Option(x))})
  
opts2_2=["2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025"]
opts2_2.forEach(function(k){Y2.appendChild(new Option(k))})
 
  
</script>
  
</body>
  
</html>

|Alexxx|# 15.04.2015 20:16

Всем спасибо, theKingOfJava отдельная благодарность.


Часовой пояс GMT +3, время: 00:55.