2010-07-15 24 views
45

Estoy usando CKEditor, jQuery y jQuery form plugin y me gustaría enviar el contenido del formulario CkEditor a través de una consulta Ajax. Aquí está mi código:Cómo ajax-enviar un formulario de entrada textarea de CKEditor?

<form id="article-form" name="article-form" method="post" action="/myproject/save"> 
    <textarea name="bodyText" style="visibility: hidden; display: none;"></textarea> 
    <script type="text/javascript"> 
    CKEDITOR.replace('bodyText'); 
    </script> 

    <a onClick="$("#article-form").ajaxSubmit();">Submit</a> 

</form> 

Por desgracia, parece que la petición Ajax no pasa el parámetro bodyText;

¿Qué hice mal o cómo puedo lograr lo que necesito?

Gracias.

+0

por sí mismo no es necesario para ocultar el área de texto, CKEDITOR se encargará de eso. En caso de que CKEDITOR no se esté cargando, el usuario todavía obtiene un campo de entrada. – Lexib0y

Respuesta

131

necesita llamar primero lo siguiente, para hacer las CKEDITORs actualizan sus campos relacionados ..

for (instance in CKEDITOR.instances) 
    CKEDITOR.instances[instance].updateElement(); 

por lo

HTML

<a onClick="CKupdate();$('#article-form').ajaxSubmit();">Submit</a> 

y javascript

function CKupdate(){ 
    for (instance in CKEDITOR.instances) 
     CKEDITOR.instances[instance].updateElement(); 
} 
+0

Gracias. ¿Dónde debo hacer esta llamada: antes de CKEDITOR.replace o antes de ajaxSubmit()? – fabien7474

+0

@fabien, respuesta actualizada –

+0

Ok. Funciona cuando se coloca antes de ajaxSubmit(). Muchas gracias – fabien7474

1

Yo sólo lo hizo así:

$('#MyTextArea').closest('form').submit(CKupdate); 

     function CKupdate() { 
      for (instance in CKEDITOR.instances) 
       CKEDITOR.instances[instance].updateElement(); 
      return true; 
     } 
8

Si utiliza el jQuery form plugin, puede utilizar la opción beforeSubmit para una solución más elegante:

$("#form").ajaxForm({ 
    beforeSubmit: function() 
{ 
     /* Before submit */ 
    for (instance in CKEDITOR.instances) 
    { 
     CKEDITOR.instances[instance].updateElement(); 
    } 
}, 

    // ... other options 
}); 
16

Esto funciona para mí mejor: beforeSerialize devolución de llamada

$('form#description').ajaxForm({ 
    beforeSerialize:function($Form, options){ 
     /* Before serialize */ 
     for (instance in CKEDITOR.instances) { 
      CKEDITOR.instances[instance].updateElement(); 
     } 
     return true; 
    }, 
    // other options 
}); 
+0

Esto es correcto. Debe hacerlo antes de serializar porque, de lo contrario, los datos que está actualizando con updateElement() no se actualizarán hasta la próxima vez que intente serializar los datos. – stormlifter

+0

¡Muchas gracias! Solo esto funciona para mí y estoy de acuerdo con #stormlifter – Besnik

+0

¡Muchas gracias! Solo esto funciona para mí también. Gracias de nuevo. – Kavin

6

En mi caso, lo siguiente me ayudó, simplemente uso estas dos líneas antes de seializar el formulario.

for (instance in CKEDITOR.instances) 
     CKEDITOR.instances[instance].updateElement(); 

    var data = $('#myForm').serializeArray(); 
3

que hemos probado algo como esto:

Primero tuve que poner un id = "#myForm" en @ Html.BeginForm después, puse estos en mi guiones parte en la que yo uso en el guión:

<script type="text/javascript"> 
    $(document).ready(function CKupdate() { 
     $('#myForm').ajaxForm(function() { 
      for (instance in CKEDITOR.instances) { 
       CKEDITOR.instances[instance].updateElement(); 
      } 
     });  
    }); 
</script> 

y luego hice algo como esto =] para mi botón de enviar y funciona bien para mí, no más pulsando la presentará dos veces =]

<button type="submit" id="submitButton" onclick="CKupdate();$('#myForm').ajaxSubmit();">Submit</button> 
Cuestiones relacionadas