Pregunta

Problema: Tengo una página de comentarios en cada apartado de comentarios que tiene un botón 'responder'. Ahora los botones tienen una respuesta jQuery clic en vivo vinculante sobre ellos, que cuando se activa el formulario cargas comentario apropiado a través de AJAX. Además de los campos habituales, cada forma contiene una entrada de código de imagen también. Después de que el formulario envía con éxito (o no) i, actualizar el captcha, así:

// submit triggered and form serialized
$.ajax({
 type: 'POST',
 url: myaction,
 data: serializedForm,
 cache: false,
 success: function(data, status) {
    //checks errors from server
    $servererr = $(data).find('.error_list');
    if($servererr.length === 0)
    {
      //flash success message...
      //refresh captcha
      $thisform.find('.captcha_img_refresh').trigger('click.refresh');
    }
    else {
       //flash the server errors and then refresh captcha         
      $thisform.find('.captcha_img_refresh').trigger('click.refresh');
    }
});

Ahora tengo 2 formas frescas de comentario (F1 y F2) abiertos en la misma página (que tiene 2 acciones diferentes, digamos / post / f1 y post / f2, respectivamente). Cómo envío f1 y ningún otro error. Luego voy a la segunda forma y entrar en todos los detalles válidos y que arroja error de código de imagen desde el servidor (por lo que el Ajax sentencia else se ejecuta por encima). Firebug muestra:

> //for first form
> POST http://mysite.com/post/f1 302 Found 111ms
> GET http://mysite.com/post/f1 200 OK 600ms
> 
> //for 2nd form
> POST http://mysite.com/post/f2 200 OK 800ms

¿Por qué sucede esto? Todo lo demás parece estar bien (Hay también sin problema entregando formularios con Javascript desactivado).

formulario HTML:

<form id="comment-form-<unique-number>" class="comment-form-new" action="/post/<separate-action>" method="post" style="">
 <p>Leave a comment:</p>
   <ul>
    <li>
     <textarea rows="10" cols="71" name="myform[text]" id="myform_text"></textarea></li>
    <li>
     <label for="myform_username">Name (required)</label>
     <input type="text" name="myform[username]" value="Anonymous" id="myform_username" /></li>
   <li>
      <label for="myform_email">Email (required)</label>
      <input type="text" name="myform[email]" value="" id="myform_email" />
   </li>

   <li>
    <label for="myform_captcha">Please enter code shown below:</label>
     <input type="text" name="myform[captcha]" id="myform_captcha" />
   </li>
   <li>
     <img id="captcha_img" src="/mysite/captcha/126263" alt="Captcha Image">
     <!-- this refreshes captcha -->
     <a class="captcha_img_refresh" id="captcha_img_refresh"><img src="/images/reload_original.png" /></a>
   </li>
   <input type="hidden" name="myform[comment_id]" value="10" id="myform_comment_id" />
   <li>
     <input type="submit" value="Submit" id="comment-form-submit" />
   </li>
</ul>

Otros detalles: después de cada formulario de comentarios cargas, hago lo normal submit vinculante (no vive vinculante) sobre el mismo. Los valores para cada formulario se serializa y se envía como se ha escrito en los campos de la cual se puede confirmar a través de los registros de consola. Estoy usando la biblioteca Cryptographp ( http://www.captcha.fr/ ) para los captchas.

Solución: Si restauro todas las letras cifradas en todos los formularios de la página después de presentar cualquier forma, algunos captchas muestran imágenes de error que puede, por supuesto, ser fijado por el usuario haciendo clic en el refresco botón de nuevo. Pero estoy en busca de algo distinto a esta solución.

¿Fue útil?

Solución

De acuerdo ... he hecho un poco más pruebas y esto es lo que creo que está pasando (que podría ser mal también): el vínculo de la imagen de captcha, que es algo así como: / proyecto / código de imagen / (un número aleatorio) , es probable que genera una vez en el servidor para cada formulario. Cuando cargo f1 y f2, un enlace código de imagen para f2 se almacena en el backend que básicamente anula enlace de código de imagen de la F1. Por lo tanto, si presento f1 (que todavía está abierta), el captcha falla. Así que supongo que podría intentar (en frontend):

  1. Permitir sólo una forma de la contestación a la vez
  2. Caché el enlace de código de imagen y utilizar de nuevo para regenerar la imagen cuando el usuario se centra en la forma correspondiente
  3. Use la solución mencionada anteriormente

¿Hay una manera de resolver este backend?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top