jquery load() entfernt Skript-Tags – Problemumgehung?

Lesezeit: 12 Minuten

jquery load entfernt Skript Tags Problemumgehung
Scott Clark

Kennt jemand eine Problemumgehung für jquery .load(), die die aus externen Inhalten geladenen Skript-Tags entfernt?

Es gibt viele Dokumentationen darüber, dass dies passiert, aber nach etwa 4 Stunden Suche im Internet kann ich keine Lösung finden?

Ich lade dynamisch generierte Divs – ähnlich wie eine Seite mit Suchergebnissen – und muss ein .click() an ein Element in jedem dynamisch generierten Div binden. Ich habe eine PHP-Datei, die die HTML-Generierungsarbeit erledigt und den gesamten HTML-Code als Zeichenfolge zurückgibt, aber ich kann die jquery .click() nicht binden, da die Skript-Tags, die die jquery-Funktion enthalten, entfernt werden.

Hier ist der Code, der den externen Inhalt durch Aufrufen der PHP-Datei lädt …

$("#titles_wrap").load("m_scripts/m_php/titles_loader.php", function(){
                                                                $..some code
                                                                });

und hier ist die Schleife aus der PHP-Datei, die die Divs generiert (das funktioniert gut) …

$tag1='<script type="text/javascript">';
$tag2='</script>';

while($result_array = mysql_fetch_array($result)) {

            if($i2<=($titles_total)){

                $_SESSION['titles_string'] .= '<li id="listItem_'.$i2.'">

                                                <div id="titles_list_item">

                                                    <div id="titles_list_image_box" style="background-image: url(../../images/thumbs_test/'.$result_array[0].'); background-repeat: no-repeat; ">'.($i2+1).'</div>
                                                    <div id="title_php_loader"></div>
                                                        <div id="title_info_wrap">

                                                        <div id="title_current"><span class="title_current_grey" >current title: </span><br>'.$result_array[1].'
                                                            </div>

                                                                <div id="title_form_wrap">
                                                                    <span class="title_current_grey" >new title: </span><br><input name="title_input_'.$i2.'" id="title_input_'.$i2.'" type="text" class="title_input"></input>
                                                                    <div id="title_send" class="title_send_'.$i2.'">GO</div>
                                                                </div>

                                                            </div>


                                                    '.$tag1.'
                                                    $(".title_send_'.$i2.'").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")})
                                                    '.$tag2.'

                                                </div>
                                            </li>';
                $i2++;
                                }
            }

Tut mir leid, wenn dieser zweite Code-Block ein bisschen auf der “Overkill”-Seite ist – lassen Sie mich wissen, ob ein vereinfachter Auszug nützlicher wäre. Das heißt, Sie können in der 8. von der letzten Zeile des PHP-Codes die jquery-Funktion sehen, die in jedes div mit einem dynamisch zugewiesenen Selektor geschrieben werden sollte.

Natürlich könnte es sein, dass der Code andere Fehler enthält, aber ich werde ihn nicht testen können, bis ich .load() dazu bringen kann, ihn nicht mehr zu zerstören!

Wenn jemand eine Lösung dafür gefunden hat – oder sogar einen Workaround mit begrenzter Gnade – brillant!

Vielen Dank im Voraus,

Beifall,

Scott

BEARBEITEN – BEARBEITEN – BEARBEITEN – BEARBEITEN – BEARBEITEN – BEARBEITEN – BEARBEITEN – BEARBEITEN

@TJ Crowder @Frug

Danke für Ihre Hilfe!

Ich habe mir gerade die Seiten Ihrer Demo genau angesehen und ja, ich sehe, Sie haben es zum Laufen gebracht. Scheint erstaunlich, denn da sind sie – diese Skript-Tags und es gibt SO viele Leute da draußen, die es nicht zum Laufen bringen können – leider bin ich einer von ihnen!

Die einzigen Unterschiede, die ich zwischen Ihrer Demo und meiner Code-Situation sehe, waren

1) keine Typdeklaration im öffnenden script-Tag,

2) Sie laden eine Seite mit Skript-Tags als Teil des DOM, während ich die PHP-String-Ausgabe geladen habe (ich glaube wirklich nicht, dass das wichtig ist, oder? Bis es den Client erreicht, kommt alles zum dasselbe, oder?)

3), hat Ihr .load-Aufruf eine ganze Seite abgerufen, während meiner nur Elemente zurückgab. Seitdem habe ich die Ausgabezeichenfolge so geändert, dass sie alle , und -Tags enthält, aber grrrrrr … Ich kann immer noch nicht die verdammten Skript-Tags dazu bringen, im DOM angezeigt zu werden.

Irgendwelche Vorschläge? Es gibt jede Menge, von denen ich nichts weiß, also könnte alles sein! danke s

Aktualisieren Sie jetzt, das Sie auf der jQuery-Dokumentationsseite finden können:

http://api.jquery.com/load/

Tags werden nur entfernt, wenn Sie load mit einem bestimmten angehängten Selektor aufrufen.

Skriptausführung

Beim Aufrufen von .load() über eine URL ohne angehängten Selektorausdruck wird der Inhalt an .html() übergeben, bevor Skripts entfernt werden. Dadurch werden die Skriptblöcke ausgeführt, bevor sie verworfen werden. Wenn .load() mit einem an die URL angehängten Auswahlausdruck aufgerufen wird, werden die Skripte jedoch vor der Aktualisierung des DOM entfernt und daher nicht ausgeführt. Ein Beispiel für beide Fälle ist unten zu sehen:

Hier wird jedes JavaScript, das als Teil des Dokuments in #a geladen wird, erfolgreich ausgeführt. 1

$('#a').load('article.html');

Im folgenden Fall werden jedoch Skriptblöcke im Dokument, das in #b geladen wird, entfernt und nicht ausgeführt: 1

$('#b').load('article.html #target');

  • Die vollständigste Antwort, die ich bisher gesehen habe.

    – Eduard Lukas

    15. Mai 13 um 23:39 Uhr

Dieser Thread ist zwar schon etwas älter, aber ich habe einen Workaround dafür gefunden $.load + Selektor + <script> Problem/Funktion, die ich teilen möchte. Vielleicht ist es für jemanden hilfreich. Anstatt $.loadIch benutze das:

$.ajax({
    url: '/some/url',
    success: function(html) {
        var content = $('<div />').html(html).find('#my-custom-selector');
        $('#container-to-place-html-in').html(content);
    }
});

Tschüss, Alex

  • Sehr schlau. Danke für das Teilen

    – Bazinga

    6. Juni 21 um 19:51 Uhr

jquery load entfernt Skript Tags Problemumgehung
TJ Crowder

jQuery load nicht Skript-Tags entfernen (Beispiel), und der Inhalt, den Sie von Ihrem PHP-Skript zurückgeben, enthält keine Skript-Tags. Es gibt etwas JavaScript, aber es ist nicht richtig eingebettet script -Tags und wird daher vom Browser nicht erkannt.

Wenn Sie das JavaScript hierin haben möchten:

...
'.$tag1.'
$(".title_send_'.$i2.'").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")})
'.$tag2.'
...

um als JavaScript erkannt zu werden, fügen Sie es in a ein script Schild.

...
'.$tag1.'
<script>"$(".title_send_'.$i2.'").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")})</script>
'.$tag2.'
...

…oder noch besser, verwenden Sie eine Single script -Tag am Ende des Inhalts, um Dinge miteinander zu verbinden, oder der Rückruf auf der load Funktion.


Aktualisieren: Zu deiner Bearbeitung:

1) keine Typdeklaration im öffnenden script-Tag,

Spielt keine Rolle, sehen Sie dieses aktualisierte Beispiel. Der Browser interpretiert die script Tag nach den gleichen Regeln, die immer gelten.

2) Sie laden eine Seite mit Skript-Tags als Teil des DOM, während ich die PHP-String-Ausgabe geladen habe (ich glaube wirklich nicht, dass das wichtig ist, oder? Bis es den Client erreicht, kommt alles zum dasselbe, oder?)

Richtig, es läuft alles auf dasselbe hinaus, sobald es im Browser ankommt.

3), hat Ihr .load-Aufruf eine ganze Seite abgerufen, während meiner nur Elemente zurückgab. Seitdem habe ich die Ausgabezeichenfolge so geändert, dass sie alle , und -Tags enthält, aber grrrrrr … Ich kann immer noch nicht die verdammten Skript-Tags dazu bringen, im DOM angezeigt zu werden.

Mein Beispiel lädt nur ein Snippet, nicht eine ganze Seite.

Ich weiß nicht, warum deine nicht funktioniert. Ich habe mich gefragt, ob es mit mehreren Skriptelementen zusammenhängt, die in einer Schleife ausgegeben werden, oder mit der Tatsache, dass Sie a angeschlossen haben click Handler, aber es ist keines von beidem.

Es bleibt nichts anderes übrig, als Ihr nicht funktionierendes Beispiel zu nehmen und Schichten Stück für Stück abzuziehen, bis Sie den Teil finden, der, wenn Sie ihn entfernen, ihn arbeiten lässt. Grundsätzlich ist es wieder nicht das mit load lässt die Skripte nicht funktionieren (unabhängig davon, wie viele Leute Sie finden, die das denken; es ist eine große Welt, es gibt viele Leute, die fast alles denken). Sie müssen die Idee loslassen, dass dies mit jQuery zusammenhängt load Funktion, die irgendetwas mit den Skripten macht; es ist wahrscheinlich nicht.

Der Schlüssel zum Debuggen dieser Art von Dingen ist wirklich vereinfachen, vereinfachen, vereinfachen. Stellen Sie sicher, dass der HTML-Code, der vom Server für die Ajax-Aufrufe zurückgegeben wird, so aussieht, wie Sie es sich vorstellen (keine seltsamen Anführungszeichen oder so). Versuchen Sie es mit statischen Seiten. Etc.

  • Skript-Tags werden von den PHP-Variablen oben im Codeblock in den zurückgegebenen PHP-String eingefügt. Ich habe es auf beide Arten versucht – mit den in den String geschriebenen Skript-Tags und über PHP-Variablen. beides funktioniert nicht. scheint seltsam, dass Sie sagen, dass jquery .load keine Skript-Tags entfernt, da viele Leute dieses Problem haben.

    – Scott Clark

    17. Mai ’11 um 21:19 Uhr

  • @Scott: Entschuldigung, war mir nicht klar $tag1 und $tag2 hatte die Tags drin (die Namen hätten ein Hinweis sein sollen). “scheint seltsam, dass Sie sagen, dass jquery .load keine Skript-Tags entfernt, da viele Leute dieses Problem haben.” Ich habe es nicht nur gesagt, ich gezeigt es. Folgen Sie dem Link und Sie können sehen, dass das eingebettete Skript einwandfrei funktioniert.

    – TJ Crowder

    18. Mai ’11 um 7:45 Uhr

  • Wie hast du es gemacht?! Bitte lesen Sie den Originalbeitrag für alle Details … S

    – Scott Clark

    18. Mai ’11 um 20:40 Uhr

  • @Scott: Siehe Update. Habe noch ein paar andere Sachen probiert, aber das ist es auch nicht. Viel Glück damit,

    – TJ Crowder

    18. Mai ’11 um 21:58 Uhr

  • Vielen Dank für die Hilfe – leider kann Ihre Antwort noch nicht als nicht genug “Reputation” bewertet werden! nächstes Mal… 🙂

    – Scott Clark

    19. Mai ’11 um 13:10 Uhr

Können Sie bitte bestätigen, ob die Skripte entfernt werden oder die Ereignisbindung nicht funktioniert? Ich denke jedoch, dass Sie die Herangehensweise ein wenig ändern können. Ändern Sie zuerst Ihr Skript wie

$("#titles_wrap").load("m_scripts/m_php/titles_loader.php", function(){
                                                                $..some code
                                                                $("[class^='title_send_']").click(function(){$("#title_php_loader").load("m_scripts/m_php/title_sender.php")});
                                                                });

Entfernen Sie dann den Skriptteil aus dem PHP-Code

while($result_array = mysql_fetch_array($result)) {

            if($i2<=($titles_total)){

                $_SESSION['titles_string'] .= '<li id="listItem_'.$i2.'">

                                                <div id="titles_list_item">

                                                    <div id="titles_list_image_box" style="background-image: url(../../images/thumbs_test/'.$result_array[0].'); background-repeat: no-repeat; ">'.($i2+1).'</div>
                                                    <div id="title_php_loader"></div>
                                                        <div id="title_info_wrap">

                                                        <div id="title_current"><span class="title_current_grey" >current title: </span><br>'.$result_array[1].'
                                                            </div>

                                                                <div id="title_form_wrap">
                                                                    <span class="title_current_grey" >new title: </span><br><input name="title_input_'.$i2.'" id="title_input_'.$i2.'" type="text" class="title_input"></input>
                                                                    <div id="title_send" class="title_send_'.$i2.'">GO</div>
                                                                </div>

                                                            </div>
                                                </div>
                                            </li>';
                $i2++;
                                }
            }

Warum können Sie die Callback-Funktion nicht verwenden, um die Ereignisse zu binden, anstatt sie auf Ihrer PHP-Seite einzubetten?

Es könnte eine Möglichkeit geben, dies zu umgehen, aber ich würde es von vornherein nicht einbinden, weshalb Sie keine anderen finden, die dies tun. Wenn Sie Bindungen in den Rückruf einfügen, werden sie angehängt, wenn er geladen wird.

  • ja, ich verstehe deinen Punkt. aber wie kann ich Bindungen vom Callback zu einer unbekannten Anzahl von Elementen mit dynamisch generierten Selektoren hinzufügen – dh $(“.title_send_’.$i2.'”)? Ist dies möglich, nachdem der Inhalt geladen wurde?

    – Scott Clark

    17. Mai ’11 um 21:24 Uhr

  • Ignorieren Sie die dynamischen Klassennamen und fügen Sie dem Element eine Dummy-Klasse hinzu, die nichts anderes tut, als es für Ihr Javascript zu identifizieren. Verwenden Sie wie ** class=”title_send_’.$i2.” dummyclass” ** dann an .dummyclass binden und den dynamischen Teil ignorieren. Oder wenn Ihnen das nicht gefällt, fügen Sie dem Elternteil eine Dummy-Klasse hinzu und zielen Sie dann mit .children() auf die Kinder dieses Elternteils (Sie können in einer Schleife überprüfen, wo Sie id=”title_send” haben, weil die id sollte eindeutig sein) Wenn Sie Variablen dynamisch übergeben müssen, versuchen Sie, sie in Alt- oder Title-Tags einzufügen und sie mit attr() herauszuziehen.

    – Frug

    17. Mai ’11 um 21:39 Uhr


  • ok – scheint der Weg zu gehen. Ich habe eindeutige IDs in der PHP neu zugewiesen und mich für eine konsistente Klasse entschieden. Ich werde später heute noch einmal daran arbeiten – Besprechungen heute Morgen – aber ich werde berichten, sobald ich es zum Laufen gebracht habe … vielen Dank für die bisherige Hilfe! S

    – Scott Clark

    18. Mai 11 um 5:07 Uhr

1643319671 676 jquery load entfernt Skript Tags Problemumgehung
Benutzer3119196

Ich weiß, es ist scheiße, aber eine Sache, die Sie tun können, ist, so etwas wie in den zu ladenden HTML-Code zu schreiben, und dann nach der .ajax- oder .load-Methode im Callback eine Zeichenfolge zu ersetzen -> html = html.replace( /lscript/g, ‘script ‘);

Etwas zu diesem Zweck sollte das Tag als nicht ausgeführtes Tag ziehen.

hoffentlich hilft das 🙂

  • ja, ich verstehe deinen Punkt. aber wie kann ich Bindungen vom Callback zu einer unbekannten Anzahl von Elementen mit dynamisch generierten Selektoren hinzufügen – dh $(“.title_send_’.$i2.'”)? Ist dies möglich, nachdem der Inhalt geladen wurde?

    – Scott Clark

    17. Mai ’11 um 21:24 Uhr

  • Ignorieren Sie die dynamischen Klassennamen und fügen Sie dem Element eine Dummy-Klasse hinzu, die nichts anderes tut, als es für Ihr Javascript zu identifizieren. Verwenden Sie wie ** class=”title_send_’.$i2.” dummyclass” ** dann an .dummyclass binden und den dynamischen Teil ignorieren. Oder wenn Ihnen das nicht gefällt, fügen Sie dem Elternteil eine Dummy-Klasse hinzu und zielen Sie dann mit .children() auf die Kinder dieses Elternteils (Sie können in einer Schleife überprüfen, wo Sie id=”title_send” haben, weil die id sollte eindeutig sein) Wenn Sie Variablen dynamisch übergeben müssen, versuchen Sie, sie in Alt- oder Title-Tags einzufügen und sie mit attr() herauszuziehen.

    – Frug

    17. Mai ’11 um 21:39 Uhr


  • ok – scheint der Weg zu gehen. Ich habe eindeutige IDs in der PHP neu zugewiesen und mich für eine konsistente Klasse entschieden. Ich werde später heute noch einmal daran arbeiten – Besprechungen heute Morgen – aber ich werde berichten, sobald ich es zum Laufen gebracht habe … vielen Dank für die bisherige Hilfe! S

    – Scott Clark

    18. Mai 11 um 5:07 Uhr

.

665710cookie-checkjquery load() entfernt Skript-Tags – Problemumgehung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy