J'envoie une requête get jquery comme ceci:
$.get($(this).attr("href"), $(this).serialize(), null, "script");
La réponse que je m'attends à recevoir sera encapsulée dans des balises de script.
Je comprends que le navigateur n'exécute la réponse que si elle est renvoyée sans les balises de script. Normalement, je supprimerais les balises de la réponse, mais dans ce cas, je n’ai pas accès au code exécuté sur la machine distante, je ne peux donc pas supprimer les balises à la source.
Existe-t-il un moyen de retirer les balises de script du côté client de la réponse et d’exécuter le javascript?
Vous devriez pouvoir faire ce qui suit:
$.get($(this).attr("href"), $(this).serialize(), function(data){
var script = $(data).text();
eval(script);
});
Ou:
var myScript = new Function($('script#myscript',responseText).text());
myScript();
Si je comprends bien votre question, cela devrait suffire à extraire le texte des balises de script:
$(response).text()
Est-ce que cela vous aiderait: http://docs.jquery.com/Ajax/jQuery.getScript ?
La réponse de Jose Basilio est correcte, mais je recommande de remplacer eval par jQuery's globalEval function ...
$.get($(this).attr("href"), $(this).serialize(), function(data) {
script = $(data).text();
$.globalEval(script);
});
globalEval est la fonction qui serait normalement appelée lorsque vous appelez une méthode ajax avec un type de retour de script .
Cela provient de la documentation de l'API ...
Cette méthode se comporte différemment de l'utilisation d'un eval () JavaScript normal, car elle est exécutée dans le contexte global (ce qui est important pour le chargement dynamique de scripts externes).
Je l'ai fait légèrement différemment, et utilisé php land pour le rendre plus facile. (Je n'aime pas utiliser eval, ni les énormes réécritures remarquables).
J'ai placé tout mon jQuery dans une chaîne php comme ça (il y avait BEAUCOUP plus de JavaScript dans la vie réelle)
$out .= " $('#save_now').button(); \n";
$out .= " $('#save_now').click( function() {\n";
$out .= " return false;\n";
$out .= " }); \n";
alors aussi en terre php
echo "<script>\n";
echo " function onOpen(){ \n";
echo $out;
echo " } \n";
echo "</script>\n";
puis dans l'appel jQuery $ .ajax je le fais
$.ajax({
url: geturl,
type: 'post',
data: getparams,
success: function(data) {
mydiv.html(data);
onOpen();
},
cache: false
});
comme vous pouvez le voir, vous n’avez pas besoin de la chose php land, c’est juste dans mon code base que j’avais besoin de le faire. l'astuce consiste à supprimer $(document).ready(function(){});
et à rouler le vôtre
Supposons que notre réponse se trouve dans la variable 'response':
script = response.replace(/<script>(.*)<\/script>/, "$1"); // Remove tags
eval(script); // Execute javascript