web-dev-qa-db-fra.com

jQuery / Ajax - $ .ajax () Passage de paramètres au rappel - Bon modèle à utiliser?

Code JavaScript avec lequel je commence:

function doSomething(url) {  
   $.ajax({
      type: "GET",  
      url: url,  
      dataType: "xml",  
      success: rssToTarget  
   });  
}    

Motif que j'aimerais utiliser:

//where elem is the target that should receive new items via DOM (appendChild)
function doSomething(url, elem) {
   $.ajax({
      type: "GET",
      url: url,
      dataType: "xml",
      success: rssToTarget(elem)
   });
}  

Je ne pense pas que je puisse faire fonctionner le rappel de cette façon, non? Quel est le modèle approprié? Je ne veux pas utiliser nécessairement des variables globales pour contenir temporairement le nom elem ou elem.

73
BuddyJoe

Comme ça...

function doSomething(url, elem) {
  $.ajax({
     type: "GET",
     url: url,
     dataType: "xml",
     success: function(xml) {
       rssToTarget(xml, elem);
     }
  });
}

Réponse à votre commentaire: L'utilisation de fonctions anonymes affecte-t-elle les performances?

95
Josh Stodola

Le modèle que vous souhaitez utiliser pourrait fonctionner si vous créez un fermeture à l'intérieur de votre fonction rssToTarget:

function rssToTarget(element) {
  return function (xmlData) {
    // work with element and the data returned from the server
  }
}

function doSomething(url, elem) {
    $.ajax({ type: "GET",
         url: url,
         dataType: "xml",
         success: rssToTarget(elem)
       });
}

Lorsque rssToTarget(elem) est exécuté, le paramètre d'élément est stocké dans fermeture , et la fonction de rappel est renvoyée, en attente d'être exécutée.

30
CMS