2010-08-01 6 views
4

est ici une fonction pour une utilisation en tant que gestionnaire d'événements qui utilise this:Comment écrire une fonction en tant que gestionnaire d'événement et fonction appelable prenant un argument?

function validate() { 
    if (this.val() == '') { 
    return false; 
    } 
} 

$(':input').change(validate); 

est ici la même fonction réécrite pour prendre un argument, pour que je puisse l'appeler explicitement:

function validate(field) { 
    if ($(field).val() == '') { 
    return false; 
    } 
} 

validate($('#customer_name')); 

Comment puis-je réécrire ma fonction validate pour le rendre utilisable comme à la fois un gestionnaire d'événements, et comme une fonction autonome pour moi d'appeler?

Répondre

10

Il existe plusieurs façons de procéder. La première consiste à utiliser la seconde prenant le champ en tant que paramètre et définir le gestionnaire d'événement à l'aide d'une fermeture:

function validate(field) { 
    if ($(field).val() == '') { 
    return false; 
    } 
} 

// Use anonymous function to pass "this" to validate. 
$(':input').change(function() { validate(this); }); 

// Unchanged. 
validate($('#customer_name')); 

Une autre façon est d'utiliser la première forme et en utilisant apply() à appeler avec une substitution this:

function validate() { 
    if ($(this).val() == '') { 
    return false; 
    } 
} 

// Unchanged. 
$(':input').change(validate); 

// Use `$(...)` as "this" when calling validate. 
validate.apply($('#customer_name')); 
+0

+1 pour appliquer(). C'est l'alternative la plus agréable et la plus idiomatique, à mon humble avis. – Tomalak

+0

PS: une erreur s'est produite dans votre second exemple de code. Je pense que cela devrait être '$ (this)' dans le corps de la fonction. – Tomalak

5

Utilisez un remplacement à this si le paramètre field n'est pas indiqué en tant qu'argument.

function validate(field) { 
    return $(field || this).val() != ''; 
} 

$(':input').change(validate); // using this context 
validate($('#someInput')); // using a parameter 
Questions connexes