2009-08-17 5 views
1

Merci à tous d'avance. C'est la première fois que je développe un plugin jQuery (et je développe aussi en javascript), et je dois dire que je suis assez geek (Il a probablement beaucoup de choses hideuses pour vous, les développeurs js/jquery expérimentés, mais c'est mon première tentative - s'il vous plaît ours avec moi :). Je me félicite de toute critique constructive de tout code.jQuery Plugin Development - transmettre les paramètres à la fonction de rappel définie par l'utilisateur

Ceci est un plugin de boîte modèle (oui, il y en a d'autres, mais les exigences de travail dictent que je code moi-même pour éviter les dépendances tierces) qui affiche le texte donné, le texte d'un appel ajax ou un formulaire donné/pris à partir d'un appel ajax, puis gère la soumission du formulaire via ajax. Cela doit être aussi personnalisable que possible, donc j'essaye de fournir quelques hooks (?? - fonctions anonymes) que l'utilisateur peut utiliser pour passer du code personnalisé au plugin.

Le problème que je rencontre est de fournir des paramètres à la fonction utilisateur. Si j'utilise le mot clé 'this', je peux passer la variable 'msg' très bien et la fonction utilisateur peut l'utiliser. Mais quand je passe 'msg' au lieu de 'this' l'utilisateur obtient une variable vide. Je voudrais passer plus que juste le msg - également un tableau de données passées dans l'appel d'ajax et un objet de jQuery de la boîte de modèle est ce que je voudrais vraiment faire. Ci-dessous est l'extrait - la fonction est à l'intérieur de et appelée dans le plugin; J'ai juste groupé du code dans des fonctions pour l'organisation/développement.

// Submits the form inside of the model box 
    // and calls the user hooks of onFormSuccess and 
    // onFormFailure for ajax success and error 
    function submitForm() { 
     var URL = $('form',$contentNode).attr('action'), 
     method = $('form',$contentNode).attr('method'), 
     data = $('form',$contentNode).formSerialize(); 

     $.ajax({ 
      url: URL, 
      type: method, 
      data: data, 
      success: function(msg) { 
       // Doesn't work, but I would like it too 
       //settings.onFormSuccess.call(msg, breakData(data)); 
       // Does work 
       settings.onFormSuccess.call(this); 
      }, 
      error: function (XMLHttpRequest, textStatus, errorThrown) { 
       setings.onFormFailure.call(errorThrown); 
      } 
     }); 
     closeModel(); 
    } 
+0

tl dr; pourriez-vous fournir un exemple plus court? – Greg

+0

vient de le faire, désolé à ce sujet –

Répondre

5

Voir le call syntax. Le premier paramètre détermine ce que this sera à l'intérieur de la fonction de rappel elle-même. Il est pas passé en tant que paramètre à la fonction de rappel.

Pour passer des paramètres à la fonction de rappel que vous utilisez les autres paramètres de call:

settings.onFormSuccess.call(thisArg, msg, dataArray); 

Le rappel recevra ensuite deux paramètres, et courir avec this pointant vers thisArg:

function successHandler(msg, dataArray) {} 

Une autre question avec votre code est la valeur de this à l'intérieur votre gestionnaire de succès n'a pas de sens. De ce à quoi il ressemble, il va juste pointer vers l'objet window. Ainsi, les rappels que vous appelez seront également exécutés avec this == window.

Questions connexes