2011-07-29 9 views
5

Tengo algunos códigos jQuery, que se repiten una y otra vez, me gustaría reducir el código que estoy escribiendo, convirtiéndolo en funciones. aquí están los códigos que estoy usando.¿Cómo convierto este código jQuery en función jQuery?

$('form#save-user button[name="save-user"]').click(function() { 
    var formData = 'option=saveuser&'+$('form#save-user').serialize(); 
    $.ajax({ 
     type: 'POST', 
     url: 'process.php', 
     data: formData, 
     success: function(msg){ 
      if(msg === 'empty') { 
       alert('Required Values Missing'); 
      } else if(msg === 'duplicateEmail'){ 
       alert('Email already exist'); 
      } else { 
       window.location = "index.php?users&option=edit&user_id="+msg+'&msg=success'; 
      } 
     } 
    }); 
}); 

$('form#save-user button[name="save-user-close"]').click(function() { 
    var formData = 'option=saveuser&'+$('form#save-user').serialize(); 
    $.ajax({ 
     type: 'POST', 
     url: 'process.php', 
     data: formData, 
     success: function(msg){ 
      if(msg === 'empty') { 
       alert('Required Values Missing'); 
      } else if(msg === 'duplicateEmail'){ 
       alert('Email already exist'); 
      } else { 
       window.location = 'index.php?users'; 
      } 
     } 
    }); 
}); 

$('form#save-user button[name="save-user-new"]').click(function() { 
    var formData = 'option=saveuser&'+$('form#save-user').serialize(); 
    $.ajax({ 
     type: 'POST', 
     url: 'process.php', 
     data: formData, 
     success: function(msg){ 
      if(msg === 'empty') { 
       alert('Required Values Missing'); 
      } else if(msg === 'duplicateEmail'){ 
       alert('Email already exist'); 
      } else { 
       window.location = 'index.php?users&option=create'; 
      } 
     } 
    }); 
}); 

me gustaría saber algunas cosas,

a) Con referencia al código anterior, ¿cómo convertirlo en función, ya que el código tiene muy pocos cambios como, selector nombre y url de window.location.

b) ¿Cómo puedo llamar al siguiente código, ¿es la función? función en el ir? o función dinámica?

$('selector').event(function(){ 
    //jQuery Code in wake of event being triggered. 
}); 

Respuesta

5

que iba a escribir un pequeño plugin para ello:

(function ($) { 

jQuery.fn.myClick = function (destination) { 
    this.click(function() { 
     var formData = 'option=saveuser&'+$('form#save-user').serialize(); 
     $.ajax({ 
      type: 'POST', 
      url: 'process.php', 
      data: formData, 
      success: function(msg){ 
       if(msg === 'empty') { 
        alert('Required Values Missing'); 
       } else if(msg === 'duplicateEmail'){ 
        alert('Email already exist'); 
       } else { 
        window.location = destination(msg); 
       } 
      } 
     }); 
    }); 
} 

}(jQuery)); 

Entonces llamarlo sólo tendría que hacer:

$('form#save-user button[name="save-user-close"]').myClick(function() { 
    return 'index.php?users&option=create'; 
}); 

y

$('form#save-user button[name="save-user"]').myClick(function (msg) { 
    return "index.php?users&option=edit&user_id="+msg+'&msg=success'; 
}); 

Usted debe ser capaz de ver hacia dónde vamos aquí; estamos agregando parámetros al pequeño método que hemos creado, donde puede especificar qué cambios se producen entre cada llamada.

Porque en este caso, el window.location depende de la respuesta AJAX (y no conocemos la respuesta cuando invocamos la función!), No podemos simplemente proporcionar una cadena (o algo similar) como el parámetro. En su lugar, pasamos una función que invocamos una vez que se recibe la respuesta AJAX, siempre que el msg sea una variable; y confíe en la función para proporcionar una cadena que establecemos en el window.location.


En cuanto a su segunda pregunta, se pasa un manejador de eventos a los métodos de evento jQuery; un controlador de eventos será una referencia función (por lo general una referencia a un función anónima)

+2

estaba a punto de publicar mi respuesta, pero vi esta respuesta genial ... gracias por compartir ... + 1 – abhijit

+1

Sí, estaba buscando este tipo de respuesta, estoy dispuesto a hacer un complemento del código. –

4

a) Me gustaría empezar por tomar los campos cambiantes como params:

function doPost(redirectUrl) { 
    var formData = 'option=saveuser&'+$('form#save-user').serialize(); 
    $.ajax({ 
     type: 'POST', 
     url: 'process.php', 
     data: formData, 
     success: function(msg){ 
      if(msg === 'empty') { 
       alert('Required Values Missing'); 
      } else if(msg === 'duplicateEmail'){ 
       alert('Email already exist'); 
      } else { 
       window.location = redirectUrl.indexOf("{0}") >= 0 ? redirectUrl.replace("{0}", msg) : redirectUrl; 
      } 
     } 
    }); 
} 

$('form#save-user button[name="save-user"]').click(function() { 
    doPost("index.php?users&option=edit&user_id={0}&msg=success"); 
}); 

$('form#save-user button[name="save-user-close"]').click(function() { 
    doPost("index.php?users");  
});  

b) Yo diría que es un manejador de sucesos en el anonimato (función).

+0

esto no parece que la función jQuery en mi lugar me parece que se parece a la función nativa de JavaScript Sé que esto funcionará, pero ¿se considera una buena práctica seguir así? –

+0

También puede vincular el botón: doBind (buttonName) que vincula el botón al hacer clic en doPost. – user753642

+1

Lo siento, no me di cuenta de que quería un complemento de esto. Hubiera cambiado mi respuesta, pero luego @ Matt ya la ha publicado :). – Mrchief

1

Esto debe hacerlo por usted:

JQuery:

function saveuser(formData) { 
    $.ajax({ 
     type: 'POST', 
     url: 'process.php', 
     data: formData, 
     success: function(msg){ 
      if(msg === 'empty') { 
       alert('Required Values Missing'); 
      } else if(msg === 'duplicateEmail'){ 
       alert('Email already exist'); 
      } else { 
       window.location = "index.php?users&option=...'; 
      } 
     } 
    }); 
} 

HTML:

<element onClick="saveuser('the-form-data')"></element> 
+0

no quiero agregar el evento OnClick() en el campo de mi elemento html, en cambio me gustaría ir con el complemento jQuery :) –

+1

Estaba leyendo la solución de Matt, parece una solución mucho mejor, con o sin el onClick () issu. – Sparkup