2010-04-23 2 views
30

Ich habe eine HTML-Seite wie folgt:jQuery - Script-Tags im HTML werden von jQuery analysiert und nicht ausgeführt

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

Auf einer anderen Seite, ich dies tue:

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

jQuery, aber die Ausführung ist nicht das Javascript in der ersten Datei, obwohl die Dokumentation sagt, es tut. Wie kann ich es machen?

EDIT: Leider in der realen Welt Anwendung, die ich arbeite ich habe keine Kontrolle über das, was die "inklusive" Seite hat. Wir befinden uns auf derselben Domain, aber ich kann den ausgegebenen Code nicht ändern, da es sich um ein Produkt handelt, das von unserer IT-Abteilung nicht geändert werden kann.

+0

Haben Sie sehen überprüft, was, wenn Sie tun sich selbst einen 'alert()' im Skript geschieht (also innerhalb der "included" Seite)? – Pointy

+0

Nun, wenn Sie es nicht ändern können, können Sie meine Theorie überprüfen, indem Sie einen Debug-Code hinzufügen, um zu sehen, wie '$ (data) .html()' aussieht. Wenn das die Skript-Tags nicht enthält, ist das das Problem. Vielleicht möchten Sie in der jQuery-Quelle nachschauen und herausfinden, was sie zum Entfernen von Skripten tut. Es verwendet eine ziemlich hässliche Regex, aber vielleicht könnten Sie die Skripte selbst entfernen und dann ausführen. – Pointy

Antwort

40

Wie Zipfel wies aus (entschuldige das Wortspiel), jQuery mit den SCRIPT-Tags verunstaltet, wenn Sie HTML $() passieren. Sie werden jedoch nicht entfernt - sie werden einfach zur DOM-Sammlung hinzugefügt, die aus Ihrem HTML-Code erstellt wurde. Sie können die Skripte wie so ausführen:

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

     var dom = $(data); 
     $('#mydiv').html(dom.find('#something').html()); 
     dom.filter('script').each(function(){ 
      $.globalEval(this.text || this.textContent || this.innerHTML || ''); 
     }); 
    } 
}); 
+1

Genie. Vielen Dank. –

+5

Es wäre schön, wenn jQuery seine 'evalScript'-Implementierung verfügbar machen würde. Sie hätten dann 'dom.filter ('script'). Jedes ($. EvalScript)' machen können, das Skripte mit 'src'-Attributen behandelt, genauso wie die anderen dom-Manipulationsmethoden. –

+0

Für mich funktioniert es einfach, wenn ich nach dem Austausch des Inhalts den 'dom.filter' mache. Scheint logisch für mich, aber unterscheidet sich von dem, was eine qualifizierte Antwort zu sein scheint (siehe oben). Könnte jemand das korrigieren? –

0

Ich erwarte, dass die erste Seite die kein JavaScript ausführen, dies ist jedoch von der zweiten Seite nicht zugänglich ist, wird so alert(x) nicht

arbeiten Wenn Sie x zurück möchten, können Sie die Ausgabe an die AJAX haben werden Antwort.

+0

Ah - ich wollte gerade sagen, warum das nicht das Problem ist, aber ich denke, ich habe gerade herausgefunden, was das Geschäft ist. – Pointy

3

Ich bin mir nicht ganz sicher, aber es ist möglich, dass, wenn jQuery das Fragment von $(data) erstellt, die Skript-Tags an diesem Punkt verloren sind.

Wenn Sie arrangieren für die eingeschlossene Seite wirklich nur ein Fragment sein:

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

ohne andere Sachen umgeben, dann Ihr Erfolg Rückruf kann dies tun:

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

Jetzt diejenigen Skript Tags werden von der jQuery html()-Funktion bemerkt, die explizit nach ihnen sucht und sie ausblendet. Es behält jedoch diese Skriptblöcke bei und führt sie aus, nachdem es die Zielinhalte aktualisiert hat.

25

Als Alternative zu @James Antwort kann der HTML-String mit $.parseHTML() analysiert werden, durch die Aufmerksamkeit des boolean-Flag hinzuzufügen, die die Skripte true umfasst:

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

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

    } 
}); 

auf diese Weise können alle im heruntergeladenen Text eingebetteten Skripte ausgeführt werden.

+1

Danke für den Rat Guari - dies sollte gewählt werden, da es eine effizientere Option ist. – eugene

+1

Süß, genau das, was ich wollte – shramee

1

Lösung 1: der Server

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

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

    } 
}); 

Lösung genauen Inhalt zurückgeben 2: Verwendung innerHTML-

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

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

    } 
}); 
Verwandte Themen