Ajax редактирование таблиц и табличных данных

Ссылка на исходники обновлена 25.06.2020 (пока без комментариев)

По просьбам трудящихся – исходники. В архиве .sql и .php – всё в одном, и вывод и обработчик, всё с подробными комментариями.


 

Привет тебе дорогой читатель, сегодня мы немного поговорим об инлайновом редактировании данных в таблицах без перезагрузки страницы (inline edit ajax).

Как я уже сказал, передо мной встала задача редактирования данных в таблицах. После непродолжительных поисков нашел подходящий вариант, который не использует дополнительные плагины и библиотеки кроме самой jQuery. А таких на самом деле вагон и целая тележка и у каждого есть свои преимущества и недостатки. Один из самых неплохих по функционалу – jqGrid, но о нём мы поговорим в следующий раз.

Представим, что наши данные, по умолчанию, хранятся в базе. В моём примере это будет MySql, обновляться они будут с помощью JS и PHP по технологии AJAX.

AJAX, Ajax (ˈeɪdʒæks, от англ. Asynchronous Javascript and XML — «асинхронный JavaScript и XML») — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. В результате, при обновлении данных веб-страница не перезагружается полностью, и веб-приложения становятся быстрее и удобнее.

Источник: Википедия

Итак обсудим то, что у нас имеется, и то, что мы хотим получит в итоге

Исходные данные:

ТаблицЫ с данными, которые генерируются на PHP, запросом из нашей базы данных.
Допустим у нас есть две таблицы: клиенты (clients) и сотрудники (workers)
Поля наших таблиц на самом деле неважно какие, но возьмём для примера такие:

  • id – первичный уникальный ключ с авто инкрементом.
  • firstname – имя сотрудника или клиента
  • lastname – фамилия сотрудника или клиента
  • phone – телефон сотрудника или клиента

Необходимый результат:

Возможность редактирования всех полей всех таблиц без перезагрузки страницы.

Что нам для этого потребуется?

  • jquery.js – jQuery javascript framework
  • Заполненные таблицы в БД
  • Азы PHP + JS
  • Смекалка

Приступим к выполнению нашей задачи

Первым делом подключаем необходимую библиотеку (jQuery) внутри тегов <head></head>. Я обычно использую самую последнюю версию, чтобы поддерживать актуальность знаний о возможностях этой чудно библиотеки и подключаю её минифицированную версию из репозитория Google Hosted Library. На момент написания статьи актуальная версия 1.9.1, её и подключаем.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" type="text/javascript"></script>

Далее присваиваем нашей таблице уникальный идентификатор id, который соответствует названию таблицы в базе (это важно!).
Выводим все строки циклом и присваиваем строкам класс – edit, класс с названием столбца в БД и числовой класс с идентификатором строки в БД.

</pre>
<table id="clients">
<tbody>
<tr>
<th>Имя</th>
<th>Фамилия</th>
<th>Телефон</th>
</tr>
<!--Эта часть выводится с помощью php -->
<tr>
<td class="edit firstname '.$rows['id'].'">'.$rows['firstname'].'</td>
<td class="edit lastname '.$rows['id'].'">'.$rows['lastname'].'</td>
<td class="edit phone '.$rows['id'].'">'.$rows['phone'].'</td>
</tr>
</tbody>
</table>
<pre>

Далее нам необходим скрипт, который позволит редактировать данные в таблице. Как он работает, я опишу комментариями к каждой строке ниже в коде

//при нажатии на ячейку таблицы с классом edit
$('td.edit').click(function(){
//находим input внутри элемента с классом ajax и вставляем вместо input его значение
$('.ajax').html($('.ajax input').val());
//удаляем все классы ajax
$('.ajax').removeClass('ajax');
//Нажатой ячейке присваиваем класс ajax
$(this).addClass('ajax');
//внутри ячейки создаём input и вставляем текст из ячейки в него
$(this).html('<input id="editbox" size="'+ $(this).text().length+'" type="text" value="' + $(this).text() + '" />');
//устанавливаем фокус на созданном элементе
$('#editbox').focus();
});

Итак форма для редактирования текста у нас появилась, что же мы с ней будем делать дальше?
Теперь нам необходимо сохранять введенные данные при каком то событии, я приведу пример сохранения данных при нажатии Enter.

//определяем нажатие кнопки на клавиатуре
$('td.edit').keydown(function(event){
//получаем значение класса и разбиваем на массив
//в итоге получаем такой массив - arr[0] = edit, arr[1] = наименование столбца, arr[2] = id строки
arr = $(this).attr('class').split( " " );
//проверяем какая была нажата клавиша и если была нажата клавиша Enter (код 13)
   if(event.which == 13)
   {
//получаем наименование таблицы, в которую будем вносить изменения
var table = $('table').attr('id');
//выполняем ajax запрос методом POST
 $.ajax({ type: "POST",
//в файл update_cell.php
 url:"update_cell.php",
//создаём строку для отправки запроса
//value = введенное значение
//id = номер строки
//field = название столбца
//table = собственно название таблицы
 data: "value="+$('.ajax input').val()+"&id="+arr[2]+"&field="+arr[1]+"&table="+table,
//при удачном выполнении скрипта, производим действия
 success: function(data){
//находим input внутри элемента с классом ajax и вставляем вместо input его значение
 $('.ajax').html($('.ajax input').val());
//удаялем класс ajax
 $('.ajax').removeClass('ajax');
 }});
 }});

Также для удобства, добавляем несколько строчек кода, которые убирают наш input при нажатии вне поля ввода, ведь мы можем не захотеть сохранять введенную информацию.

$('#editbox').live('blur',function(){
$('.ajax').html($('.ajax input').val());
$('.ajax').removeClass('ajax');
});

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

Если кому нужны будут полные исходники моего варианта скрипта – пишите в коменты.

Дополнение №1

В версии jQuery 1.9.1 отключен метод .live. Вместо него нужно использовать метод .on, сравните синтаксис сами:

$(document).on('blur', '#editbox', function(){
$('.ajax').html($('.ajax input').val());
$('.ajax').removeClass('ajax');
});

По материалам http://www.iwebux.com


Comments

69 responses to “Ajax редактирование таблиц и табличных данных”

  1. Саша, не получается сделать, выложи БД. Спасибо! Вообще хорошо пишешь, продолжай в том же духе!

  2. Статья помогла при написании проекта, спасибо. Единственное чем я дополнил это:
    Если добавить строчку if($(‘#editbox’).length>0) {return false} после $(‘td.edit’).click(function(){ то нормально станет тыкаться мышкой для редактирования текста

  3. Рад что статья кому-то помогла, спасибо

  4. Спасибо, получилось!

  5. А можете бросить на почту реальный пример, где это используется? Заранее благодарен

  6. День добрый!
    А вот такого стиля я еще не видел.
    Можно полный исходник скрипта – не выходит у меня?
    Спасибо

  7. сколько не пытался но тоже не выходит. можно исходничек, чтоб было от чего отталкиваться

  8. Далее нам необходим скрипт, который позволит редактировать данные в таблице
    ============

    НЕ РАБОТАЕТ!

  9. Этот скрипт для определенной таблицы, если мы не знаем названия столбцов, то тогда это все бесполезно((

  10. Добрый день. Можно ли получить полные исходники вместе с update_cell.php?

  11. Всем привет! По многочисленным просьбам, в ближайше несколько дней выложу исходники и реальный пример

  12. Пожалуйста отправте исходник срипта на [email protected]

  13. Укажите, пожалуйста, где можно ознакомиться с исходниками?

  14. добрый день, очень благодарен за код! Долго искал! А тут так компактно и удобно! Но , никак не могу понять как добиться редактирования таблицы в бд. Не могли бы все таки скинуть исходники? Больше всего интересует uptade_cell.php.. Заранее огромное спасибо!!

  15. Вышлите пожалуйста исходники)

  16. Можно исходники плиз!!!!

  17. В начале статьи добавил живой пример и исходники

  18. не работает поле field,скрипт постоянно меняет id а остальные колонки не трогает

  19. Что значит не работает поле field? Опишите вашу проблему более подробно

  20. Здравствуйте. Как сделать чтобы курсор при нажатии ставился в конец строки а не в начало. не могу настроить данный $(‘#editbox’).focus();
    спасибо большое, скрипт отличный.

  21. А как сюда еще пароль прикрутить? нехорошо ведь если кто-то в твою БД вносит изменения.

  22. Большое спасибо за скрипт! Очень пригодился. Единственное, хотелось бы поправку внести: к ячейке таблицы наверное стоит обращаться не по классу, а по уникальному id, иначе скрипт будет делать столько запросов к базе, сколько на странице имеется этих самых ячеек с данным классом

  23. И еще одна проблемка нарисовалась)) Если таблиц на странице >1, то фиг получишь правильный id. Я добавил таблице класс и переписал
    var table = $(‘table.edit’).attr(‘id’);

  24. Всё правильно – это ведь лишь пример а не готовое решение для мейнстрима.

  25. В исходниках, в скрипте нужно написать

    //Сохранение при нажатии вне поля
    ……
    вместо
    var arr =(‘td.edit’).attr(‘class’).split( ” ” );
    написать
    var arr =(‘td.ajax’).attr(‘class’).split( ” ” );

    иначе выбирается 1 столбец 1строки

  26. Круто пишешь. Такая качественная подача информации – редкость. Спасибо огромное!

  27. Здравствуйте! Скиньте, пожалуйста исходники посмотреть, буду очень благодарна 0)))

  28. Ссылка на исходник указана в статье

  29. спасибо!, все работает как часы)

  30. Этот снимок с экрана демонстрирует выбранную строку. Отображаются значения, введенные в форму Add new item , за исключением значений, помеченных в коде таблицы как нередактируемые или несоздаваемые.

  31. Немного не понятно, что вы имеете ввиду

  32. Скрипт полезный, но есть 2 проблемы:
    1) Изменяем и сохраняем любую ячейку, обновляем страницу
    Самая первая ячейка приняла то же значение!
    2) Во время редактирования ячейки при попытке ткнуть указателем мыши в нужное место слова, например в конец, чтобы дописать, курсор перескакивает в н ачало ячейки.

  33. 1) Ситуация возникает из за последнего блока “Сохранение при нажатии вне поля”. Если его убрать, отрабатывает корректно.

  34. подскажите, почему появляется пробел в начале строки при нажатии на ячейку?
    Запись потом так и сохраняется в ячейке с пробелом в начале.
    спасибо!

  35. update_cell.php, где можно посмотреть?

  36. В нашем случае указывается файл, который обработает отправленный запрос. Скачайте исходники и сравните код. Ссылка на исходники на этой странице – http://quato.com.ua/lessons/ajax-edit.php

  37. Приветствую!
    Хорошая реализация.
    А вы можете выслать недостающий файл, полную версию скрипта?
    За ранее спасибо!
    Мой адрес: [email protected]

  38. Например, так:

    Заменить
    $(‘#editbox’).focus();

    на
    var el=document.getElementById(‘editbox’);
    el.focus();
    el.setSelectionRange(el.value.length,el.value.length);

  39. Такой пример на чистом javascript и взят из контекста судя по последней строке.

  40. Спасибо автору статьи и Galexy – . Ваш комментарий очень помог.
    Заменил:
    var arr = $(‘td.edit’).attr(‘class’).split( ” ” );
    на:
    var arr = $(‘td.ajax’).attr(‘class’).split( ” ” );

    и заработало, как надо.

  41. Хорошого времени суток, а как зделать редактиррование нескольких таблиц з одной бази даних на 1 странице? Можно код или исходник?

  42. Не выводил значения в таблицу из базы. Поправил php код.

    Имя
    Фамилия
    Телефон


    fetch_assoc())
    {
    ?>

    <td class="edit firstname “>
    <td class="edit lastname “>
    <td class="edit phone “>

  43. Вместо:
    foreach ($table as $rows)

    Поставить:
    while ($rows = $table->fetch_assoc())

  44. А так, спасибо! То что искал. :)

  45. Хм. Прошу извинить. Не работало только в OpenServer. На хостинге работает и при foreach и второй способ.

  46. Добрый день! и Все же как устранить проблему с последним блоком? он важен для удобства, но обновление первой ячейки вместе с нужной убивает

  47. Прошу прощения, сам разобрался, возникла другая проблема, у меня таблицы в которых от 28 до 31 ячейки(графики работы) при заполнении возникла проблема не заполняются ячейки с 13 по 19, подскажите в чем проблема, спасибо

  48. Добрый день!
    Можно ли мне полные исходники?
    [email protected]

  49. Приведите пример кода, или постучитесь в скайп. Контакты на странице контактов.

  50. Еще один момент.

    Не отрабатывает click на iOS (проверял на 10). На Android +Google Chrome, и Windows + FireFox + Google Chrome все работает.

    Для решения проблемы, нужно добавить в код touchstart:

    //при нажатии на ячейку таблицы с классом edit
    $(document).on(‘click’, ‘td.edit’, function(){

    //при нажатии на ячейку таблицы с классом edit
    $(document).on(‘click touchstart’, ‘td.edit’, function(){

Leave a Reply

Your email address will not be published. Required fields are marked *