33 votes

jQuery - les balises de script dans le HTML sont analysées par jQuery et non exécutées

J'ai une page HTML comme ceci:

<html>
<body>
<div id='something'>
    ...
    <script>
    var x = 'hello world';
    </script>
    ...
</div>
</body>
</html>

Sur une autre page, je fais ceci:

$.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {
        $('#mydiv').html($(data).find('#something').html());
        alert(x);
    }
});

jQuery, cependant, n'est pas l'exécution du code javascript dans le premier fichier, même si la documentation indique qu'il ne. Comment puis-je faire cela?

EDIT: Malheureusement, dans le monde réel de l'application que je suis en train de travailler sur je n'ai pas de contrôle sur ce que les "inclus" page. Nous sommes sur le même domaine, mais je ne peux pas modifier le code qu'il génère comme c'est un produit emballé notre département ne nous laissera pas de les modifier.

45voto

James Points 56229

Comme Pointy l'a souligné ( excusez le jeu de mots ), jQuery salit les balises SCRIPT lorsque vous passez du HTML à $() . Il ne les supprime pas cependant - il les ajoute simplement à la collection DOM produite à partir de votre HTML. Vous pouvez exécuter les scripts comme ceci:

 $.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {

        var dom = $(data);

        dom.filter('script').each(function(){
            $.globalEval(this.text || this.textContent || this.innerHTML || '');
        });

        $('#mydiv').html(dom.find('#something').html());

    }
});
 

31voto

guari Points 916

Comme alternative à la réponse @James, la chaîne HTML peut être analysée avec $.parseHTML() , en faisant attention à ajouter l'indicateur booléen qui inclut les scripts à true :

 $.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {

        var content = $($.parseHTML(data, document, true)).find('#something');
        $('#mydiv').html(content);

    }
});
 

de cette façon, tous les scripts incorporés dans le texte téléchargé peuvent être exécutés.

3voto

Pointy Points 172438

Je ne suis pas totalement sûr de cela, mais il est possible que ce qui se passe est que lorsque jQuery s'accumule dans le fragment de la $(data), les balises de script sont perdu à ce point.

Si vous pouvez vous arranger pour la inclus la page pour être vraiment seulement un fragment:

<div id='something'>
  <!-- ... -->
  <script>var x = 'hello world';</script>
</div>

sans aucune autre entourant stuff, votre succès de rappel peut faire ceci:

success: function(data) {
  $('#mydiv').html(data);
}

Maintenant, ces balises script sera remarqué par le jQuery html() de la fonction, qui stipule explicitement que les cherche et les bandes de l'en sortir. Il n'est toutefois retenir de ces blocs de script, et il les exécute après avoir fini la mise à jour de la cible de contenu.

1voto

xiaoyifang Points 174

Solution 1: le serveur renvoie le contenu exact

 $.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {

        $('#mydiv').html(data);

    }
});
 

Solution 2: utilisez innerHTML

 $.ajax({
    url: 'example.html',
    type: 'GET',
    success: function(data) {

        var dom = $(data);
        $('#mydiv').html(dom.find('#something')[0].innerHTML);

    }
});
 

0voto

James Wiseman Points 18347

Je m'attends à ce que la première page exécute le JavaScript, mais cela n'est pas accessible à partir de la deuxième page, donc alert(x) ne fonctionnera pas

Si vous voulez que x retourné, vous devrez le sortir dans la réponse AJAX.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X