2010-12-14 19 views
6

Tengo un formulario que puede agregar datos a una base de datos. Todo está hecho con jquery y ajax, así que cuando presiona enviar, valida el código y luego, si todo está correcto, envía los datos de la publicación sin actualizar la página. El problema es que el formulario funciona la primera vez, pero luego cuando vas a enviar otra entrada con el formulario, no funciona. Pensé que tenía algo que ver con laFormulario de Jquery que solo funciona la primera vez que lo envía, y no el segundo

$(document).ready(function(){ 

Pero realmente no tienen idea. He pegado parte del código a continuación. Es bastante largo, pero esto debería proporcionar información suficiente para saber lo que está haciendo. El archivo js todo está en http://www.myfirealert.com/callresponse/js/AddUser.js

$(document).ready(function(){ 
$('#AddCaller').click(function(e){ 

    //stop the form from being submitted 
    e.preventDefault(); 

    /* declare the variables, var error is the variable that we use on the end 
    to determine if there was an error or not */ 
    var error = false; 
    var Firstname = $('#Firstname').val(); 
    ...OTHER FORM FIELDS HERE 

    /* in the next section we do the checking by using VARIABLE.length 
    where VARIABLE is the variable we are checking (like name, email), 
    length is a javascript function to get the number of characters. 
    And as you can see if the num of characters is 0 we set the error 
    variable to true and show the name_error div with the fadeIn effect. 
    if it's not 0 then we fadeOut the div(that's if the div is shown and 
    the error is fixed it fadesOut. */ 


    if(Firstname.length == 0){ 
     var error = true; 
     $('#Firstname_error').fadeIn(500); 
    }else{ 
     $('#Firstname_error').fadeOut(500); 
    } 
    if(Lastname.length == 0){ 
     var error = true; 
     $('#Lastname_error').fadeIn(500); 
    }else{ 
     $('#Lastname_error').fadeOut(500); 
    } 
    ...MORE CONDITIONAL STATEMENTS HERE 




    //now when the validation is done we check if the error variable is false (no errors) 
    if(error == false){ 
     //disable the submit button to avoid spamming 
     //and change the button text to Sending... 
     $('#AddCaller').attr({'disabled' : 'true', 'value' : 'Adding...' }); 

     /* using the jquery's post(ajax) function and a lifesaver 
     function serialize() which gets all the data from the form 
     we submit it to send_email.php */ 
     $.post("doadd.php", $("#AddCaller_form").serialize(),function(result){ 
      //and after the ajax request ends we check the text returned 
      if(result == 'added'){ 

       //$('#cf_submit_p').remove(); 
       //and show the success div with fadeIn 
       $('#Add_success').fadeIn(500); 
       $('#AddCaller').removeAttr('disabled').attr('value', 'Add A Caller'); 
       document.getElementById('Firstname').value = ""; 
       document.getElementById('Lastname').value = ""; 
       document.getElementById('PhoneNumber').value = ""; 
       document.getElementById('DefaultETA').value = ""; 
       document.getElementById('Apparatus').value = ""; 
       document.getElementById('DefaultLocation').value = ""; 


       setTimeout(" $('#Add_success').fadeOut(500);",5000); 

      }else if(result == 'alreadythere'){ 
            //checks database to see if the user is already there 
       $('#Alreadythere').fadeIn(500); 
       $('#AddCaller').removeAttr('disabled').attr('value', 'Add A Caller'); 
      } 
      else{ 
       //show the failed div 
       $('#Add_fail').fadeIn(500); 
       //reenable the submit button by removing attribute disabled and change the text back to Send The Message 
       $('#AddCaller').removeAttr('disabled').attr('value', 'Send The Message'); 

      } 
     }); 
    } 
});  
}); 

En este momento, la primera vez que se utiliza la forma que funciona muy bien. y el botón vuelve a habilitarse, pero luego, cuando intenta hacer otra entrada y hace clic en el botón, no ocurre nada.

¡Gracias por la ayuda!

EDIT: Después de que el formulario envía la primera vez que el botón está habilitado todavía y puede hacer clic en él, pero cuando se hace clic en él no pasa nada ... incluso si no rellena el formulario. Es como si el evento click del formulario no se activara la primera vez.

EDIT2 Según lo solicitado, voy a publicar el código HTML, está detrás de un sitio protegido con contraseña, por lo que no puedo enviarle el enlace de la página.

<form action='addcallers.php' method='post' id='AddCaller_form'> 

<h2>Add Callers</h2> 
<p> 
First Name: 
<div id='Firstname_error' class='error'> Please Enter a First Name</div> 
<div><input type='text' name='Firstname' id='Firstname'></div> 
</p> 

<p> 
Last Name: 
<div id='Lastname_error' class='error'> Please Enter a Last Name</div> 
<div><input type='text' name='Lastname' id='Lastname'></div> 
</p> 
...MORE FORM FIELDS HERE 


<div style="display:none;"> 
<input type='text' name='DefaultLocation' id='DefaultLocation' value= "Sometthing"  readonly=readonly > 

</div> 
</p> 

<p> 




<div id='Add_success' class='success'> The user has been added</div> 
<div id='Alreadythere' class='error'> That user is already in the database</div> 
<div id='Add_fail' class='error'> Sorry, don't know what happened. Try later.</div> 
<p id='cf_submit_p'> 
<input type='submit' id='AddCaller' value='Send The Message'> 
</p> 
</form> 

</div> 

Edit3 Hay otra Ajax en la página también, pero está escrito en javascript recta. No estoy seguro de si eso afectaría la funcionalidad de alguna manera. Pero si es necesario, puedo publicar ese ajax también.

EDIT4 que tiene el tutorial original del http://web.enavu.com/tutorials/create-an-amazing-contact-form-with-no-ready-made-plugins/ y modificaron

EDITAR Después de poner en algunas alertas diferentes, descubrí que no hace la declaración condicional if(error==false)... idea de por qué?

+0

De vistazo rápido, esto debería funcionar bien. Agregue alertas en líneas clave y vea dónde se detiene o, mejor aún, elimínelas con Firebug o algo equivalente, y avísenos los resultados. –

+0

Sí, en particular, usaría una "alerta()" o "console.log()" para asegurarme de que el manejador "click" se invocó en la segunda pasada. – Pointy

+0

El evento click no se está llamando la segunda vez. Puede hacer clic en el botón todo lo que quiera, pero no sirve de nada – Bill

Respuesta

4

más probable, es el campo #DefaultLocation, ya que es una de sólo lectura y que está restableciendo después del primer mensaje:

document.getElementById('DefaultLocation').value = ""; 

Y nunca cambia su valor a algo (o es usted?) por lo que tiene que hacer uno de los siguientes:

  1. no lo reinicie
  2. establece su valor con algo después de posar la forma
  3. no validan en absoluto ya que es una de sólo lectura y lo está usando como una entrada oculta (¡lo que está mal por cierto)!

Además, puede ser el otro código "ajax" del que está hablando así que por favor publíquelo también aquí, también puede tener otros campos (elementos) en otra parte de la página con identificaciones similares a las del forma ..

todos modos, aquí están sometips para usted: 1- cerrar las etiquetas de entrada correctamente (añadir/al final de la misma):

<input type='text' name='Firstname' id='Firstname' /> 

2- asegúrese de que todos los DIVs y $ están cerrados ... como parece que tienes una P abierta aquí:

<p> 


<div id='Add_success' class='success'> The user has been added</div> 
<div id='Alreadythere' class='error'> That user is already in the database</div> 
<div id='Add_fail' class='error'> Sorry, don't know what happened. Try later.</div> 
</p> <---- missing this one 
<p id='cf_submit_p'> 

3 está redeclarandolos la variable de error todo el tiempo, no es necesario hacer lo siguiente:

if(Firstname.length == 0){ 
    var error = true; 
.... 

sólo tiene que utilizar error = true; sin var esto se aplica en todos los lugares va a cambiar su valor utilice únicamente var en la inicialización:

var error = false; 

4- lugar de esto:

$('#AddCaller').attr({'disabled' : 'true', 'value' : 'Adding...' }); 

uso:

$('#AddCaller').attr({'disabled' : 'disabled', 'value' : 'Adding...' }); 

5- si está utilizando DefaultLocation como un campo oculto a continuación, en lugar de esto:

<div style="display:none;"> 
<input type='text' name='DefaultLocation' id='DefaultLocation' value= "Sometthing"  readonly=readonly /> 

</div> 

uso:

<input type="hidden" name="DefaultLocation" id="DefaultLocation" value="Something" /> 
+0

Volví a subir esta respuesta, pero el w3 no ha especificado un valor estándar para el atributo deshabilitado. True es simplemente la mejor alternativa para los atributos booleanos. Microsoft se encargó de sugerir que 'disabled =" disabled "' estaba bien en Visual Studio, pero eso no es necesario. – jwiscarson

+0

@jwiscarson: ¿estás seguro? http://reference.sitepoint.com/html/input/disabled también el nuevo HTML5: http://www.w3.org/TR/html-markup/input.text.html#input.text.attrs.disabled – ifaour

+0

Tiene razón: en HTML5, está deshabilitado, disabled = "" o disabled = "disabled". Tiendo a no utilizar HTML5 como referencia, sin embargo, porque el documento es un trabajo en progreso. – jwiscarson

-2

tratar de cambiar esto: $('#AddCaller').attr({'disabled' : 'true', 'value' : 'Adding...' }); en que: $('#AddCaller').attr({'value' : 'Adding...' });

Esto debería hacer que funcione.

+0

Él ** quiere ** que se deshabilite mientras el POST está en vuelo. – Pointy

1

No elimine el atributo de deshabilitado, establézcalo en falso.

Esta línea

$('#AddCaller').removeAttr('disabled').attr(... 

debería ser

$('#AddCaller').attr('disabled', false).attr(... 
+0

También pensé así, pero esto: http://jsfiddle.net/jksLm/ me probó que estaba equivocado. : -/ –

+0

Desea eliminar el atributo attr inhabilitado porque su presencia indica que está deshabilitado, independientemente del valor que tenga. Molesto. – carbontax

2

tratar de cambiar el uso del controlador de eventos click para presentar controlador de eventos del formulario

cambiar esta situación: $('#AddCaller').click

Para esto: $('#AddCaller_form').submit

+0

esta es una buena respuesta, no estoy seguro de qué es lo que hace un atributo 'disabled' con los manejadores de eventos, posiblemente los deje caer? Con esta respuesta, no necesita preocuparse. – brad

+0

No funciona .... – Bill

0

Supongo que al eliminar y agregar atributos, el elemento se elimina y se reemplaza por el nuevo, pero el controlador no se vuelve a adjuntar. Intente usar $('#AddCaller').live('click', function(){ //code }) en lugar de .click()

0

Esta función envía consultas a php y puede devolver los resultados del archivo php usando ajax. He dejado comentarios para la guía. la primera parte con try & catch statements no necesita modificaciones. ir a # 1 y # 2

function ajaxFunction(){ 
     var ajaxRequest; 


     //Browser compatible. keep it as it is 
     try{ 
      // Opera 8.0+, Firefox, Safari 
      ajaxRequest = new XMLHttpRequest(); 
     } catch (e){ 
      // Internet Explorer Browsers 
      try{ 
       ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
       try{ 
        ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
       } catch (e){ 
        // Something went wrong 
        alert("Your browser broke!"); 
        return false; 
       } 
      } 
     } 
     //Browser compatible end 



     ajaxRequest.onreadystatechange = function(){ 
      if(ajaxRequest.readyState == 4){ 
        //#2 opional: create functions to return data from your php file 
        $('#resultArea').html(ajaxRequest.responseText); 
      } 
     } 

     //#1 Set the form method, filename & query here here 
     ajaxRequest.open("GET", "serverTime.php?query=something", true); 
     ajaxRequest.send(null); 
    } 



ejemplo:

<input type='submit' value='ajax-submit' onclick='ajaxFunction()' /> 
0

rápida plugin de jQuery para eso ya que podría utilizar esto en casi todas las formas Ajax en su sitio:

deshabilitará todos los campos que podrían desencadenar un evento de envío y también agregará una clase en la etiqueta de formulario para que pueda aplicar un poco de estilo o mostrar un mensaje de carga cuando se envía el formulario:

jQuery.extend(jQuery.fn, { 
    formToggle: function (enable){ 
    return this.each(function(){ 
     jQuery(this)[(enable ? 'remove' : 'add') + 'Class']('disabled') 
     .find(':input').attr('disabled', !enable); 
    }, 
    enable: function(){ return this.formToggle(true); }, 
    disable: function(){ return this.formToggle(false); } 
} 

entonces en su JQ código Ajax:

[...]

var $form = $(your_form).submit(function(){ 
    $.ajax({ 
    type: 'post', 
    url: "/whatever/", 
    data: $form.serialize(), 
    success: function(){ alert ('yay');}, 
    complete: function(){ $form.enable();}, 
    error: function(){ alert('insert coin')} 
    } 
    $form.disable(); 
    return false; 
}); 

Debería ser suficiente para bloquear adecuadamente las somete mientras que las formas están enviando /recibiendo información. Si es realmente paranoico, puede agregar un cheque para que no se pueda enviar dos veces desde el momento en que el usuario activa el envío y los campos se desactivan con: if ($ form.is ('. Disabled')) return false; como primera línea del controlador de envío, pero no debería ser realmente

0

Establece algunos puntos de interrupción en Firebug y mira si se va a algún lado. El botón puede perder su controlador de clics luego de enviar y aplicar efectos. Probablemente necesites asignar click handler nuevamente luego de enviar y esas cosas.

0

No 100 % en esto pero intente configurar el código como una función separada t Cuando se vuelve a enlazar el evento click al final.

Ejemplo:

function addCaller(e) { 
    // your unchanged code 
    $('#AddCaller').click(addCaller(e)); 
} 

$(document).ready(function(){ 
    // added an unbind just in case 
    $('#AddCaller').unbind('click').click(addCaller(e)); 
}); 
Cuestiones relacionadas