Как реализовать периодическое сохранение формы в фоновом режиме? То же самое, что делает gmail.
Периодически автосохраняемая форма
Ответ 1
setInterval(function(){
var form = $('#my-form-id');
var method = form.attr('method').toLowerCase(); // "get" or "post"
var action = form.attr('action'); // url to submit to
$[method](action, form.serialize(), function(data){
// Do something with the server response data
// Or at least let the user know it saved
});
},10000); // do it every 10 seconds
Если вы не хотите использовать метод формы, но всегда хотите использовать "post", используйте:
$.post(action, form.serialize(), ... );
И если вы хотите предоставить свое собственное действие для автосохранения, которое отличается от действия для фактического сохранения:
$.post("/autosave/comments", form.serialize(), ... );
Ответ 2
Вам понадобится синхронизированный цикл на стороне клиента, который сохранит форму каждые х секунд/минут. Грубым способом сделать это будет иметь функцию setTimeout
javascript, которая собирает значения поля формы и обновляет модель с помощью запроса AJAX (PUT in Rails).
Пример
Здесь грубый способ сделать это (т.е. может быть лучший способ):
// repeat every 10 seconds
var repeatTime = 10 * 1000;
function updateModel(){
// get field values (using jQuery, etc.)
// make ajax request using these field values
//(make sure put parameters match model attribute names)
console.log('updated');
setTimeout(updateModel, repeatTime); // start call over again
}
setTimeout(updateModel, repeatTime);
Я включил console.log
, чтобы вы могли проверить это в Firebug прямо сейчас и увидеть, что updateModel
выполняется каждые 10 секунд. Я бы рекомендовал использовать jQuery для генерации запросов PUT
AJAX.
Ответ 3
Почему бы не сделать это исключительно на клиенте, используя локальную базу данных (или что-то еще)? Это должно уменьшить сложность, нагрузку на сервер и использование полосы пропускания.
Постоянное или сеансовое хранилище - независимо от того, что необходимо - и вы можете сохранить после каждого нажатия клавиши: нет необходимости в setTimeout().
Ответ 4
Sisyphus.js: Gmail-подобные черновики и бит больше. Плагин разработан для сохранения данных html-форм в LocalStorage для их восстановления после сбоев браузеров, закрытия вкладок и других катастроф. http://sisyphus-js.herokuapp.com
Статья Smashing Magazine: http://coding.smashingmagazine.com/2011/12/05/sisyphus-js-client-side-drafts-and-more/