2011-04-27 13 views
12

Cómo implementar un periódico de datos de un formulario en el fondo? Lo mismo que Gmail.forma de guardado automático

+3

periódicas peticiones Ajax? – fl00r

+0

@flOOr Sí, solicitudes de ajax periódicas. –

+1

que es una respuesta :) – fl00r

Respuesta

15
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 

Si no desea utilizar el método de la forma, pero siempre desea utilizar 'post', a continuación, utilizar:

$.post(action, form.serialize(), ...); 

Y, si desea suministrar su acción propia para la copia de seguridad automática que es diferente de la acción para el real ahorra:

$.post("/autosave/comments", form.serialize(), ...); 
+1

- @ Phrogz, ¿puedes explicar en tu primer bloque de código dónde iría la validación de formularios? –

+1

@timpeterson 3.5 años una respuesta demasiado tardía, pero: supongo que está hablando de la validación del lado del cliente y no desea enviar el formulario si no es válido. Si es así, entonces es solo código, ¿verdad? 'if (formIsValid (form)) $ [method] (...);' – Phrogz

4

Necesitará un ciclo temporizado en el lado del cliente que guarde el formulario cada x segundos/minutos. Una forma cruda de hacer esto sería tener una función javascript setTimeout que recoge valores de los campos del formulario y actualiza el modelo a través de una actualización (de venta en caso de Rails) petición AJAX.

Ejemplo

Aquí está una manera cruda de hacerlo (es decir, no podría haber una mejor manera):

// 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); 

que incluía el console.log para que pueda probar esto en Firebug en este momento y ver que el updateModel se ejecuta cada 10 segundos. Recomendaría usar jQuery para generar las solicitudes AJAX PUT.

+0

¿Puedes dar algún ejemplo? –

+2

¿Por qué no utilizar setInterval() en lugar de setTimeout()? –

1

por qué no hacer esto únicamente en el cliente, utilizando una base de datos local (o lo que sea)? Eso debería reducir la complejidad, la carga del servidor y el uso del ancho de banda.

Almacenamiento permanente o por sesión, lo que sea apropiado, y puede guardarlo después de cada pulsación de tecla: no es necesario establecer setTimeout().

Cuestiones relacionadas