Редактирование данных в таблице и отправка на сервер
Привет.
JS изучаю совсем недолго. Передо мной встала следующая задача: Есть на странице таблица, которая генерится с помощью JS, данные для таблицы приходят от сервера ввиде JSON. Эту подзадачу сделал.
<table id="edit">
<tbody>
<tr id="0">
<td>Бетмен</td>
<td>24</td>
<td>28/04/1989</td>
</tr>
</tbody>
</table>
Вторая подзадача. При клике на строку, все столбцы превращались в инпуты. После редактирования, данные отправлялись на сервер. При редактировании поля с датой нужно, чтобы выплывал виджет выбора даты. Ломаю голову уже два дня. Буду благодарен за любую помощь. |
Чет типа такого:
<!DOCTYPE html>
<meta charset="utf-8" />
<style>
table, td{
border: 1px solid #ccc;
border-collapse: collapse;
table-layout: fixed;
border-spacing: 0;
}
td{
padding: 4px;
}
td input{
width: 100%;
padding: 4px;
margin: 0;
border: none;
-moz-box-sizing: border-box;
box-sizing: border-box;
font: inherit;
height: 28px;
}
td input:focus{
outline: 1px solid blue;
}
.editable td{
padding: 0;
}
#edit{
width: 400px;
}
</style>
<table id="edit">
<tbody>
<tr id="0">
<td data-type="text">Бетмен</td>
<td data-type="number">24</td>
<td data-type="date">1989-04-28</td>
</tr>
</tbody>
</table>
<script>
(function(){
var table = document.getElementById('edit');
for (var i = 0; i < table.tBodies[0].rows.length; i++) {
var row = table.tBodies[0].rows[i];
row.onclick = onRowClick;
}
function onRowClick(event) {
var target = event ? event.target : window.event.srcElement;
this.onclick = null;
this.className = 'editable';
for (var i = 0; i < this.cells.length; i++) {
var cell = this.cells[i];
var input = document.createElement('input');
// IE fails to change "type" property to unsupported value
input.setAttribute('type', cell.getAttribute('data-type') || 'text');
input.value = cell.firstChild.data;
cell.replaceChild(input, cell.firstChild);
if (cell == target)
input.focus();
}
}
})();
</script>
Поля ввода даты и числа поддерживаются только в новых браузерах. Также не уверен по формату даты. Ловишь событие blur инпута - это значит он потерял фокус, то есть редактирование закончилось и можно отсылать данные. |
это реально не слабо!! респект и кармирование
|
danik.js,
в ие выдаёт ошибку 56 строка недопустимое значение попробовал заменить так
try {
input.type = cell.getAttribute('data-type');
} catch (e) {
input.type = 'text'
}
|
Поправил.
|
2 danik.js, спасибо.
Немного перепутал. Я использую не чистый JS, а jQuery. Вот мой набросок, но почему-то не работает. При клике на ячейку ничего не происходит.
$(function() {
$('td').click(function() {
var td_val = $(this).html();
var input_field = '<input type="text" id="edit" value="' + td_val + '" />';
$(this).empty().append(input_field);
$('#edit').focus();
});
});
Может не работает из-за того, что таблица формируется динамически с помощью jQuery и загружается в <section> через ajax? |
На момент выполнения скрипта таблицы не существует.
|
Цитата:
Цитата:
$(this).html(input_field); input_field.focus() или тут |
Цитата:
Цитата:
|
Цитата:
$('td').click(function() {
var td_val = $(this).html();
var input_field = $('<input type="text" id="edit" value="' + td_val + '" />');
$(this).html(input_field);
$(input).focus();
});
|
Может через live('click', func) нужно?
Таблица появляется после щелчка по ссылке, откуда приходят данные в JSON. После уже с помощью .getJSON формируется таблица и в нее вставляются данные.
$(function() {
$('ul.f-nav-tabs a').bind('click', function(event) {
event.preventDefault(); // Чтобы браузер по ссылке не ходил
var url = $(this).attr('href');
$.getJSON(url, function(data) {
$('table#items').remove();
var html_table = '<table id="edit"></table>';
var tr = '<tr>';
$.each(data.fields, function(key, value) {
tr += '<th>' + value + '</th>';
});
tr += '</tr>';
var html_table = $(html_table).append(tr);
$.each(data.qsd, function(key, value) {
var tmp_val = value;
var tr = '<tr id="' + key + '">';
$.each(tmp_val, function(key, value) {
tr += '<td>' + value + '</td>';
});
tr += '</tr>';
html_table = $(html_table).append(tr);
});
$('section#contentPane').html(html_table);
});
$('section#formPane').load('/hd/' + url + '/add/');
});
});
|
Batman_1989,
ставьте клик на элемент выше того что загружается
$(elem).on('click', 'td', function(event) {})
|
Цитата:
Цитата:
Например:
$('<td/>', {text: value}).appendTo(tr)
Тоже самое с tr'ками. |
danik.js,
Имею похожую задачу: https://github.com/hhru/frontend-tes...ster/README.md Подскажите тезисно, как модифицировать ваш код, и что добавить, чтобы реализоваить добавление заметки с всплывающим окном в таблицу. При этом, по заданию: "сохранение календаря в localStorage". |
| Часовой пояс GMT +3, время: 17:04. |