Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Редактируемая таблица с динамическим сохранением


Автор: zevgan 24.8.2009, 17:22
Доброго времени суток.

Нужно сделать таблицу в html с возможностью редактирования содержимого ячеек по двойному клику мышкой и динамическим сохранением внесенных изменений в MySQL БД по нажатию ентера без перезагрузки страницы. Если кто-то знает скрипт, который делает хотя бы часть из перечисленного - буду оооооочень признателен smile 

А если такого нету, тогда вот вопросы по жабаскрипту:

Как по двойному клику мышкой по ячейке удалить её содержимое, поместить в эту самую ячейку текстовое поле и уже в само это поле бросить старое содержимое ячейки. Затем отследить нажатие ентера в данном текстовом поле, убрать текстовое поле, поместить в ячейку изменённые данные и сохранить это изменение в БД без перезагрузки страницы. Для последнего думаю юзать библиотеку JsHttpRequest.

Заранее спасибо за любой ответ.

Автор: bars80080 24.8.2009, 17:59
вариант по моему не слишком кошерный, хотя бы потому, что ячеек в таблице может быть довольно много, растягивать их бесконечно тоже не есть гуд, в итоге, если туда ещё запихивать поле, и может даже с кнопкой - таблица будет дёргаться и т.п.

вариант по проще:
просто таблица, с ячейками в которых значения. на каждой ячейке событие onclick с вызовом функции. функция открывает скрытое до тех пор поле (display: none; / block;) банальный div с вложенным полем textarea и двумя кнопками "утвердить", "отменить"
при открытии этого поля, из ячейки копируются значение в поле.

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

в таком случае по нажатию кнопки "утвердить" должно происходить сравнение содержимого поля и редактируемой ячейки. если произошли изменения, то:
а) скопировать предыдущее значение ячейки в скрытое поле input:hidden, дабы можно было откатить назад
б) скопировать содержимое textarea в ячейку
в) скрыть поле textarea
г) пометить ячейку цветом, как отредактированную
д) открыть кнопку "сохранить изменения"


конечно, тут основная работа будет заключаться в сохранении идентификатора ячейки, сохранении в отдельном поле идентификаторов редактируемых строк и ячеек ,а потом на сервере ещё надо будет придумать как это всё разгребсти

тут конечно возникает серьёзный вопрос, а ты знаешь что за таблица будет редактироваться? или это универсальный скрипт под любую таблицу, которому будет отдаваться только имя таблицы?

Автор: zevgan 24.8.2009, 18:30
Большое спасибо, очень дельная идея. Да, таблица мне доступна, в ней 45 столбцов, а количество строк будет варьироваться примерно от 1 до 100, а может и больше... Короче говоря, примерно 4500 ячеек. Кошерно ли будет у каждой ячейки указывать "onclick="? Или есть другой способ, что-то вроде глобального отслеживания щелчка и постфактум выяснения, над какой ячейкой сейчас находится курсор?

textarea наверное лучше всего было бы ещё и позиционировать на место редактируемой ячейки (сугубо с точки зрения юзабилити)... Как считаете?

Да и вот ещё, уместно ли у каждой ячейки указывать уникальный id? Их всё-таки будет много...


Автор: skyboy 24.8.2009, 21:29
готовые библиотеки вполне себе могут быть найдены через google. к примеру, по запросу "editable table javascript". я вот предпочитаю jquery, потому искал под jquery: http://plugins.jquery.com/project/uiTableEdit и http://dev.iceburg.net/jquery/tableEditor/demo.php.
вот только замечу: задачу разбей таки на две части. редактирование таблицы - одна подзадача, ajax-сохранение - другая задача. тогда найдешь сразу.
Цитата(zevgan @  24.8.2009,  17:30 Найти цитируемый пост)
Или есть другой способ, что-то вроде глобального отслеживания щелчка и постфактум выяснения, над какой ячейкой сейчас находится курсор?

например, при помощи jquery можно привязать обраобтчик ко всем определенным элементам:
Код

jQuery('table#my_id td').bind('click', my_click_function);

Автор: comtat 24.8.2009, 22:14
Продолжу список от skyboy и предложу http://extjs.com/deploy/dev/examples/grid/edit-grid.html для ExtJS

Автор: bars80080 24.8.2009, 23:38
Цитата(zevgan @  24.8.2009,  18:30 Найти цитируемый пост)
Кошерно ли будет у каждой ячейки указывать "onclick="?

ну, если генерировать таблицу на сервере, то ничего особенного. если даже эти килобайты слать не хочется, то можно наградить событием onclick каждую ячейку средствами javascript уже после загрузки страницы. просто пробежавшись циклом по ячейкам и присвоив каждому элементу событие:
Код


    var t = document.getElementById('Table');
    if(!t) return false;
    var tr = t.getElementsByTagName('tr'); var trc = tr.length;
    var td = tr[0].getElementsByTagName('td'); var tdc = td.length;
    for(var i = 0; i < trc; i++) {
        td = tr[i].getElementsByTagName('td');
        for(var j = 0; j < tdc; j++) {
            td[j].aa = i; td[j].bb = j;
            td[j].onclick = function() { VRshow(this.aa, this.bb); };
        }
    }

как-то так


Цитата(zevgan @  24.8.2009,  18:30 Найти цитируемый пост)
Да и вот ещё, уместно ли у каждой ячейки указывать уникальный id?

собственно можно ориентироваться и по номеру в массиве

Автор: zevgan 25.8.2009, 01:59
Большое всем спасибо за ответы. Пришёл в восторг от EditorGridPanel. Только есть одно усложнение, про которое я забыл написать. Дело в том, что в зависимости от залогиненного пользователя меняются права записи в определённые столбцы. Тоесть скажем пользователь ХХХ может изменять только 3, 5 и 6 столбцы. Это возможно будет реализовать на данной штуке? 

Автор: comtat 25.8.2009, 08:34
Цитата(zevgan @  25.8.2009,  01:59 Найти цитируемый пост)
Только есть одно усложнение, про которое я забыл написать.

Это усложнение можно решить написав небольшой плагин к EditorGridPanel

Автор: zevgan 4.9.2009, 04:40
Долго не появлялся, писал табличку по чайной ложке в день...

Опытным путём выяснил, что  EditorGridPanel в моём случае не подходит, а оооочень жаль. Дело в большом объёме данных - изменилось количество строк со ста примерно до 400. С  EditorGridPanel такая табличка загружается минуты. В то время, как моя корявая самописка с одним лишь прикрученным JsHttpRequest в среднем 12-30 секунд. Если я не прав в своих выводах относительно  EditorGridPanel, пожалуйста, напишите, как заставить его работать быстрее.

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

Автор: comtat 4.9.2009, 08:40
Цитата(zevgan @  4.9.2009,  04:40 Найти цитируемый пост)
С  EditorGridPanel такая табличка загружается минуты.

Очень на него не похоже ..

Автор: zevgan 4.9.2009, 15:43
Не знаю, я его первый раз ручками-то пощупал. Но ведь и ячеек-то в общей массе получается до 18000, а это уже как говорится не этим-самым груши околачивать...  smile 

Автор: Nigneeliz 13.11.2022, 20:54
Модератор: Сообщение скрыто.

Автор: scalosale 8.2.2023, 23:00
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)