web-dev-qa-db-fra.com

Comment exécuter javascript dans une balise de script renvoyée par une réponse ajax

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?

19
KJF

Vous devriez pouvoir faire ce qui suit:

$.get($(this).attr("href"), $(this).serialize(), function(data){
   var script = $(data).text();
   eval(script);
});
27
Jose Basilio

Ou:

var myScript = new Function($('script#myscript',responseText).text());
myScript();
3
Alecoletti

Si je comprends bien votre question, cela devrait suffire à extraire le texte des balises de script:

$(response).text()

2
Kit

Est-ce que cela vous aiderait: http://docs.jquery.com/Ajax/jQuery.getScript ?

2
Flavius Stef

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).

1
xtempore

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

0
Mr Heelis

Supposons que notre réponse se trouve dans la variable 'response':

script = response.replace(/<script>(.*)<\/script>/, "$1"); // Remove tags
eval(script); // Execute javascript
0
cloudhead