2010-08-27 6 views
2

J'ai un message simple, qui a exécuté les données renvoyées en tant que script en tant que tel:Comment exécuter le rappel jQuery avant les données?

$.post("/home", { foo: 'bar' }, function(){ 
    //callback function 
}, "script"); 

Voici ce qui se passe:

  1. La demande est envoyée
  2. Un morceau de code JS est retourné en tant que réponse et exécuté
  3. Le rappel est exécuté

J'ai besoin que le rappel soit exécuté avant le JS retourné est exécuté. Y a-t-il un moyen d'y parvenir?

Merci!

Répondre

3

Vous ne pouvez pas changer la façon dont gérer la demande jQuery. Après tout, un rappel est un rappel et il est exécuté une fois le travail terminé! Vous pouvez toutefois définir dataType sur "text", puis évaluer votre code JavaScript.

Ex:

$.post("/home", { foo: 'bar' }, function(data){ 
    //callback function 

    // execute JS 
    $.globalEval(data); 
}, "text"); 

** MISE A JOUR **

C'est ce que jQuery ne interne (Snipped):

// If the type is "script", eval it in global context 
} else if (type === "script" || !type && ct.indexOf("javascript") >= 0) { 
    jQuery.globalEval(data); 
} 

Donc, il n'y a pas de risque de sécurité avec la prise globalEval hors de la requête Ajax et l'exécuter dans la fonction de rappel.

+0

+1 pour une solution simple et idéale – meagar

+0

cela semble idéal. jquery exécute-t-il le script de la même manière? (c'est-à-dire appelez eval() ')? Si non, y a-t-il des failles de sécurité à faire cela? –

+0

C'est ce que fait JQuery en interne si vous définissez dataType comme "script", donc non. S'il n'y a pas de risque dans un sens, il n'y a pas de risque autre. :) Lisez la mise à jour pour la réponse. –

-2

Cette fonction .post de $() n'exécute pas automatiquement la JS qui est retourné. Il est probablement exécuté dans la fonction de rappel.

+1

cela est le cas, si vous spécifiez 'script' comme quatrième paramètre, ce que j'ai fait. –

+0

bien alors, je pense que vous venez de répondre à votre propre question;) – Patricia

0

Vous pouvez utiliser l'option "beforeSend" qui est exécutée avant d'envoyer la demande ajax:

$.ajax({ 

    type: "POST", 

    url: "SOMEURL", 

    data: { "WHATEVER": whatever }, 

    beforeSend: function() { 

     //DO WHATEVER BEFORE SEND AJAX CALL 

    } 
..... 

}); 

}

Hope this helps.

Cordialement.

Jose

+0

J'ai besoin de l'exécuter après l'envoi de la requête et avant que le script est exécuté. 'beforeSend' est exécuté avant l'envoi de la requête. Merci quand même! –

+0

Helo Yuval, peut-être cet événement ajax pourrait vous aider "événement .ajaxStop" vérifier cette page: http://api.jquery.com/ajaxStop/. Je ne sais pas si le code dans ajaxStop sera exécuté avant que votre js renvoyé par l'appel ajax. Mais peut-être pourrait travailler. Vous pouvez aussi vérifier .ajaxSucess ici: http: //api.jquery.com/ajaxSuccess/ Espérons que cela aide. Cordialement. – Sosi

1

Utilisez $.ajax() et construire votre propre balise de script.

$.ajax({url:"/home", 
     data: { foo: 'bar' }, 
     type: "POST", 
     dataType: 'text',  // Return dataType is "text" instead of "script" 
     success: function(script){ 
      // run your code 
      alert('mycode'); 
      // then create your own script tag 
      var tag = document.createElement('script'); 
      tag.setAttribute('type','text/javascript'); 
      tag.appendChild(document.createTextNode(script)); 
      document.getElementsByTagName('head')[0].appendChild(tag); 
     } 
}); 
Questions connexes