web-dev-qa-db-fra.com

Comment utiliser une fonction qui prend des arguments avec la méthode changeQ de jQuery?

J'utilise la version 1.5 de jQuery. Je regarde la fonction change () de jQuery et plus précisément ce bit:

.change( [ eventData ], handler(eventObject) )
eventData: A map of data that will be passed to the event handler.
handler(eventObject): A function to execute each time the event is triggered.

Qu'est-ce qu'une "carte de données" en JavaScript? Comment puis-je utiliser la fonction de test suivante comme gestionnaire d'événements?

var myHandler = function(msg){alert(msg);};

J'ai essayé ça:

$("select#test").change(["ok"], myHandler);

et les rapports d'alerte [objet Object]

40
Manos Dilaverakis

Voir event.data . Les données ne sont pas passées en argument au gestionnaire, mais en tant que propriété de l'objet événement:

$("select#test").change({msg: "ok"},  function(event) {
    alert(event.data.msg);
});

Le gestionnaire accepte toujours un seul argument, qui est l'objet event. C'est la raison pour laquelle votre alerte affiche "[object Object]", Votre fonction imprime l'objet événement.
Si vous souhaitez utiliser des fonctions avec des arguments personnalisés, vous devez les encapsuler dans une autre fonction:

$("select#test").change({msg: "ok"},  function(event) {
    myHandler(event.data.msg);
});

ou juste

$("select#test").change(function(event) {
    myHandler("ok");
});

Btw. le sélecteur est mieux écrit comme $('#test'). Les identifiants sont (devraient être) uniques. Il n'est pas nécessaire d'ajouter le nom de la balise.

60
Felix Kling

Qu'est-ce qu'une "carte de données" en Javascript?

Fondamentalement, juste un objet, par exemple:

var data = {
    foo: "I'm foo",
    bar: "I'm bar"
};

Tous les objets JavaScript sont essentiellement des cartes (aka "dictionnaires" aka "tableaux associatifs").

Comment puis-je utiliser la fonction de test suivante comme gestionnaire d'événements?

En l'enveloppant dans une autre fonction:

$("select#test").change(function() {
    myHandler($(this).val());
});

Cela appelle myHandler avec la valeur de la boîte de sélection chaque fois qu'elle change.

Si vous souhaitez utiliser la partie eventData, ajoutez un objet avant le gestionnaire:

$("select#test").change({
    foo: "I'm foo"
}, function(event) {
    myHandler(event.data.foo, $(this).val());
});

Cela appelle myHandler avec le "I'm foo" comme premier argument, puis la valeur de la boîte de sélection, chaque fois qu'elle change.

13
T.J. Crowder