Таблица mysql загружается в браузер; при Ctrl+Alt+click ячейка становится редактируемой; по Ctrl+Enter текст ячейки сохраняется в базу без перезагрузки страницы. Без Ajax, без jQuery! | |
учебник HTML скачать
| Редактирование таблицы MySQL: Javascript интерфейсВ предыдущей статье мы рассмотрели предельно простой способ доступа к базе данных MySQL (редактирование таблицы без перезагрузки HTML страницы). Отправка данных на сервер производилась через статический элемент iframe, помещаемый программой рядом с тем местом, куда пользователь щёлкнул мышкой (рядом с редактируемой ячейкой). Статический iframe был выбран нами в качестве транспорта для того, чтобы пользователь мог видеть реакцию сервера напрямую (удалось ли изменить данные MySQL, или HTTP-сервер вернул ошибку, и какую именно). Программа получилась действительно простой и прозрачной для пользователя. Но простота повлекла за собой и неизбежные недостатки (или просто неосуществлённые возможности):
Нетрудно видеть, что последние три пункта к способу транспорта прямого отношения не имеют, однако пресловутое засорение истории (о котором так много говорят любители Ajax'a) всё-таки заставляет делать iframe динамическим. Это значит, мы теряем «естественные» ответы сервера, и сообщать пользователю об успехе (или провале) операции придётся с помощью Javascript. Рабочий пример получившейся системы можно протестировать на странице http://ir2.ru/tableedit2.htm. Функции Javascript, необходимые для работы, разместились в трёх файлах: http://ir2.ru/ir2.js (3.5K, общая библиотека), http://ir2.ru/tabsort.js (3.5K, сортировщик HTML-таблицы, необязательный элемент), http://ir2.ru/tableedit2.js (5.5K, редактор таблицы). На сервере данные, полученные от пользователя, обрабатывает небольшой (1.5K) скрипт http://ir2.ru/savecell2.php. Принципиальная схема табличного редактораСтраница HTML с таблицей для редактирования:
Вся остальная работа делается Javascript:
Некоторые особенности манипуляций с DOMСамая сложная задача – выловить из временного элемента iframe ответ сервера. Она возникает как следствие из нашей генеральной установки считать Ajax лишней сущностью. Сложной является только часть задачи: при нормальных ответах сервера iframe получает нормально сгенерированную страницу, на которой запускается Javascript, передающий родительскому окну необходимую информацию – ничего сложного, всё стандартно! А вот если, например, страница для iframe (savecell2.php) недоступна, сообщить об этом пользователю изнутри iframe не получится; надо будет из главного окна получить содержимое документа iframe. Тут тоже годится "штатная", отработанная нами в предыдущей версии Table Editor технология: Проблема возникает даже не на уровне манипуляций с DOM, а на уровне идеологии: это хорошо известное уродство ИЕ – при получении ошибки сервера "404" выдавать свою собственную страницу ошибки (и вот к этой-то "своей" странице ИЕ не предоставляет программного доступа). Из-за этого (весьма характерного для Микрософт) скотства как раз и возникает небольшая сложность, которую мы обходим с помощью таймера:
ФилософияХотя это наоборот – скорее, логика. Программа-редактор таблицы начинает работу по определённому действию пользователя – щелчку мышкой с удержанными клавишами Контрол и Альт. К чему должно быть привязано это событие? К какому объекту или элементу HTML? Возможны два варианта: 1) привязать это событие к каждому элементу, который можно редактировать – с помощью функции, которая должна будет как-то обнаружить все такие элементы на странице; 2) привязать это событие просто ко всему документу (или открытому окну браузера) – тогда определять редактируемость элемента надо будет позже, в процессе обработки события. Мы не рискнули (или поленились) заранее попытаться определить, куда пользователю можно щёлкать, а куда нет, и выбрали второй путь. То есть программа обработки щелчка запускается, куда бы пользователь ни щёлкнул. А значит, надо вовремя программу останавливать. Это делается на трёх разных этапах работы:
Последний каменьПри использовании Ajax (xmlHTTPRequest) для отлавливания ошибок (и вообще сообщений) сервера существуют специальные методы, призванные вроде бы облегчить работу. Они и облегчают – на ошибке "404" ("Страница не найдена"), которую мы выбрали для тестирования как самую простую. Но в реальной жизни практически невероятно встретить такую ошибку в работе фоновых HTTP-запросов: организуя отправку через Javascript таких запросов, мы ведь сами указываем страницу-обработчик, которую сами же и помещаем на сервер. Гораздо более вероятно примитивнейшее "зависание" HTTP-сервера или "тормоз" канала связи (или ещё какие-нибудь проблемы интернет-провайдера) – что во всех случаях будет выглядеть просто как отсутствие какого-либо ответа. И тогда "штатный" Ajax теряет все свои преимущества перед нашей простенькой конструкцией с iframe: и там, и тут проблема решается одинаково – с помощью таймера. У нас она в случае любых ошибок (т.е. при отсутствии HTTP-ответа "200 OK" в течение секунды) решается с помощью таймера, т.е. более единообразно и просто, чем в Ajax. Ну, и ничего страшного не случится, если таймер сообщит пользователю об ошибке связи, а после этого отработает серверный скрипт и пришлёт сообщение "OK" – работа будет сделана, и пользователь узнает об этом. D.M., admin 105. Аркадий
У меня тут вопрос такой, у меня операционна Макинтош на ноуте аппловскойм. Браузер сафари. Так вот, когда нажимаю редактировать все ок, но не могу выйти из редактирования! Т/е/ жму esc и ничего не происходит, сохраняет нормально но опят же не выходит из режима редактирования 28.04.2010 15:25:34 106. Аркадий
и когда тут у Вас оставляешь комент, непонятно куда он девается....добавился или нет 0_0 28.04.2010 15:33:38 107. D.M., admin
Ну, хорошо, что вообще комментарии отправляются. Самый-то плохой javascript при отправке происходит. Пойду смотреть, почему esc не работает. А вообще, не люблю я Сафари... 05.05.2010 12:25:34 108. D.M., admin
Всё, исправил. Сафари тут ни при чём. Просто поменял систему скрытия объектов (сделал на classname вместо display:none) – в одном месте поменял, в другом не поменял, вот они и перестали скрываться. А вообще это уже вчерашний день. Новейшая разработка (mysql-редактор): http://dn-irkutsk.ru/mmedit/ 05.05.2010 13:04:33 Добавить комментарий: |