2010-04-26 6 views
0

J'ai une fonction onclick qui effectue plusieurs tâches. Dans une autre fonction javascript, je n'ai pas accès aux variables de contexte nécessaires pour effectuer ces tâches. Pour contourner cela, j'ai simplement appelé la fonction onclick directement.Un moyen de passer des paramètres par programme à une fonction onclick?

Le problème que j'ai maintenant est que je voudrais effectuer une tâche après une action Ajax dans l'onclick complète. Est-il possible pour moi de passer une fonction à la méthode onclick d'un lien? À quoi ressemblerait l'attribut onclick?

par exemple. quelque chose comme ceci:

<a id="link3" href="javascript:void(0);" onclick="function(callback) { X(a); Y(b); Z(c, callback); };">click me</a> 

En cliquant sur ce passerait « non défini » comme le rappel, alors que je pourrais aussi appeler explicitement comme ceci:

document.getElementById("link3").onclick(function() { alert("Completed all tasks"); }); 

est quelque chose comme cela possible? Fondamentalement, je veux être en mesure de passer un paramètre optionnel à la méthode onclick, mais si elle est absente, je veux qu'elle se comporte comme s'il y avait du code procédural dans onclick.

EDIT: Ajout plus de détails

Le cas d'utilisation est que le onclick appelle une fonction de recherche qui nécessite des variables de session. Lorsque des recherches régulières sont effectuées, il n'y a pas de problème, mais quand je souhaite rafraîchir les résultats de la recherche (par exemple quand l'utilisateur édite ou supprime un des résultats retournés), je dois appeler la même fonction de recherche que précédemment et imprimer un message de retour après qu'ils ont été actualisés. Cette sortie de message de retour est ce que je voudrais être dans la méthode de rappel. Je voudrais aussi mettre window.location.href à la page jusqu'à la rangée affectée dans le cas d'une modification ou d'une insertion.

J'ai accès à plusieurs variables du côté serveur que j'imprime directement à l'attribut onclick lorsque je rends la page. Dans d'autres fichiers Javascript que j'inclus sur ma page j'aimerais aussi pouvoir exécuter les mêmes fonctions contenues dans l'onclick. Le seul problème étant que je devrais passer toutes ces variables à ces fonctions indirectement à travers plusieurs méthodes intermédiaires dans la chaîne d'appel.

L'autre option consiste à imprimer ces valeurs à des valeurs de pages masquées, puis les récupérer dans ma méthode, mais je voudrais éviter cela car il serait encombrer tout juste pour que je puisse décorer mon appel de fonction avec certains séquelles visuelles.

+0

À quel moment voulez-vous transmettre le paramètre à la méthode? Comment allez-vous injecter un paramètre dans l'événement click? Je ne comprends pas. –

+0

@Pekka: Je viens d'ajouter un exemple de l'appeler explicitement plutôt qu'avec un clic de souris. –

Répondre

1

Bien que cela puisse être possible d'une manière ou d'une autre, je recommande de ne pas ajouter d'arguments aux événements DOM natifs.

Je ne vois pas non plus de véritable besoin architectural pour cela. Pouvez-vous donner un exemple complet d'un cas d'utilisation où vous en avez besoin? Je suis sûr que quelqu'un peut trouver une solution alternative qui ne nécessite pas d'arguments supplémentaires.

Ne serait-il pas, dans votre exemple, le bon endroit pour placer le alert le rappel success de la requête Ajax?

+0

Je suppose que oui ... J'ai essayé d'avoir un seul appel AJAX javascript mais cela ne fonctionne pas très bien quand je souhaite que le comportement de rappel diffère en fonction de l'endroit où il a été appelé. Je suppose que je ne peux pas utiliser le raccourci de déléguer à un appel de méthode de type commutateur et devra appeler des fonctions directement dans ce cas. Désolé si cela semble vague ... c'est plutôt difficile à expliquer sans copier tout mon code, et je ne peux pas le faire dans ce cas particulier. –

+0

@RenderIn mmm, je pense que vos besoins sont déjà servis. Vous pouvez obtenir l'élément qui a déclenché l'événement 'onclick' - il diffère légèrement entre les navigateurs, il y a des bulles et d'autres problèmes, et je préfère utiliser un framework comme jQuery, mais c'est possible, vous aurez toujours un événement complet objet. Vous pouvez ensuite faire votre demande Ajax et transmettre toute information importante (comme l'élément cliqué) à la fonction de rappel. Je pense que cela devrait fonctionner correctement. –

0

Cela fonctionne pour moi:

<body onload="f = document.getElementById('link3').onclick; f(function(){alert('Completed all tasks')});"> 
<input id="link3" type="button" onclick="alert(typeof(arguments[0])); arguments[0]()"> 
</body> 

La première renvoie directive « fonction », et le second renvoie « toutes les tâches accomplies », comme prévu.Dans votre cas, ce qui suit devrait fonctionner:

<input id="link3" type="button" onclick="X(a); Y(b); Z(c, arguments[0]);">