Дмитрий П.
441 сообщение
#16 лет назад
Возникла проблема с дизайном интерфейса. Поделитесь, пожалуйста, мыслями и опытом - сам пока не могу придумать такое решение, которое меня бы устроило.

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

Ситуация.
Пользователь последовательно обновляет данные в таблице, переключаясь между ячейками TAB-ом. Вот он дошел до последней ячейки, которую хотел бы отредактировать, ввел в нее новые данные и... Все. Мышой он специально никуда не тыкает, еще раз TAB ему нажимать не надо. Соответственно, событие 'change' не возникает, ajax-запрос на сервер не уходит.

Вопрос.
Как быть?
Можно, конечно, сделать кнопку "Сохранить", но тогда придется отказаться от сохранения данных по событию 'change' (т.к. это будет создавать неочевидную ситуацию - данные сохраняются без нажатия кнопки).
Можно показывать какой-нибудь индикатор рядом с редактируемой ячейкой, который сигналил бы о том, что данные еще не сохранены, но тогда тоже надо какую-нибудь кнопочку сооружать.

Может кто-нибудь с чем-то подобным сталкивался?
Новик Роман
697 сообщений
#16 лет назад
Событие 'change' происходит в момент изменения значения текстового поля, при чём тут события курсора? Вы, наверно, перепутали это событие с событием изменения фокуса.
Болатов А.
1090 сообщений
#16 лет назад
В прикладной программе я бы просто задержку ввел бы, чтобы обновление происходило по потере фокуса или через полсекунды после прекращения ввода.
Не знаю, можно ли так сделать в web-интерфейсе.
Но вообще это неправильно, кнопка "Сохранить" нужна.
Новик Роман
697 сообщений
#16 лет назад
alibek, можно сделать проще. Каждое изменение можно вносить в скрытую форму, а данные отсылать по любому событию, например: событие весеннего солнцестояния.
Дмитрий П.
441 сообщение
#16 лет назад
Novick, нет, я ничего не перепутал. Событие 'change' заключается в изменении данных, сопровождающемся потерей контролом фокуса. См.

alibek, идея с задержкой мне в голову приходила, реализовать ее, в принципе, можно. Сложность в том, что задержку надо будет отсчитывать с момента последнего нажатия пользователем на клавишу. Здесь могут вылезти проблемы с кроссбраузерностью.

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

Кнопка "Сохранить" в этом случае будет нужна только если JS отключен (система сделана так, что при отключенном JS тоже работает, только немного медленнее - сейчас данные в таблицу ajax'ом подгружаются).
Болатов А.
1090 сообщений
#16 лет назад
Цитата ("sukebe"):
Появилась еще одна мысль - можно сделать так, чтобы по нажатию Enter'а на клавиатуре не субмитилась форма, а сохранялось значение текущей ячейки и с нее убирался фокус (или курсор переходил бы на следующую ячейку, если она существует).

Да, идея хорошая.
Новик Роман
697 сообщений
#16 лет назад
sukebe, change =>
The change event occurs when a control loses the input focus and its value has been modified since gaining focus. This event is valid for INPUT, SELECT, and TEXTAREA. element.
<_< Действительно странно. Событие onChange TEXTAREA, происходит по событию смены фокуса. В ActionScript я такой "беды" не замечал... Все на ActionScript!
Виктор Брылев
226 сообщений
#16 лет назад
Цитата ("sukebe"):
alibek, идея с задержкой мне в голову приходила, реализовать ее, в принципе, можно. Сложность в том, что задержку надо будет отсчитывать с момента последнего нажатия пользователем на клавишу. Здесь могут вылезти проблемы с кроссбраузерностью.

Никаких проблем с кросбраузерностью не возникает. А задержку нужно делать обязательно. Особенно это критично если вы сохраняете данные в БД. Без задержки ваша БД загнется под грузов сотен запросов при одновременном редактировании текста 3-4 людьми одновременно.
Не забывайте что число одновременных соединений с БД ограничено