Script als Teil einer AJAX Antwort laden
Encoder
- javascript
Tagchen
Ich stelle gerade eine Seite um, um sie für mobile Datentarife zu optimieren, sprich es sollen Inhalte bei Bedarf mit AJAX nachgeladen werden.
Das klappt soweit, nur ein Punkt geht noch nicht. Zu einem nachgeladenen Inhalt gehört ein Block Javascript. Der wird bisher mit dem HTML zusammen geladen. Es ergibt sich folgender Aufbau.
<div id="content_xy">
<script type="text/javascript">
hier das Script
</script>
hier der Inhalt des divs
</div>
Alles innerhalb des divs namens content_xy wird nachgeladen, auch das Script. Und dieses wird ignoriert. Krieg ich das irgendwie so hin dass es beim Laden passend berücksichtigt wird?
Falls nicht, wohin lädt man Javascript am besten nach?
hi,
das problem ist, dass da eigentlich nichts mehr ausgeführt sondern nur dargestellt wird. wenn du das ajax mit jquery ausführst kannst du das problem beheben.
Code kann ich dir gerade nicht bereit stellen, nur stichwort:
$('#' + elmt).empty();
$('#' + elmt).append(data);
Wenn du das append machst, sollte er es wirklich ausführen und alles nachladen. ob du das empty brauchst ist deine sache. Geht sicher auch mit anderem script, ich kenne es leider nur mit jquery.
das problem ist, dass da eigentlich nichts mehr ausgeführt sondern nur dargestellt wird. wenn du das ajax mit jquery ausführst kannst du das problem beheben.
Sofort ausgeführt werden soll da nichts. Im der Scriptabschnitt sind Funktionen, die vom nachgeladenen Inhalt aufgerufen werden. Diese Funktionen sollten dem Browser bekannt sein, das sind sie aber anscheinend nicht.
Ich schau mir mal an was append alles macht, vielleicht ist da ja ein Hinweis dabei wie ich mein Script als solches nachträglich bekannt machen kann.
sofort ausgeführt heißt in dem fall, das Javascript zu interpretieren und die ganzen sachen eben verfügbar zu machen ;). Wann du die aktionen ausführst ist natürlich deinem code zu entnehmen.
Mit append wird auf jeden fall auch jedes JS nachgeladen was du eventuell in dateien angehängt hast.
Ich habs geschafft. Danke an die Poster mit Tips.
Ich ziehe mir per Regex den Inhalt des <script...> </script> raus und verfüttere den an das Konstrukt aus jquery, das ich dort im Code gefunden habe:
(window.execScript || function( data ) {
window[ "eval" ].call( window, data );
}) (*hier der Inhalt des Scripts*);
Es wird entweder window.execScript oder eine andere Funktion ausgeführt, mit dem Scripttext als Parameter.
Diese andere Funktion besteht aus
window[ "eval" ].call( window, (*hier der Inhalt des Scripts*))
und was das soll blick ich nicht. Falls jemand dazu noch was sagen kann, wär ich echt dankbar.
مرحبا
Ich habs geschafft. Danke an die Poster mit Tips.
(window.execScript || function( data ) {
window[ "eval" ].call( window, data );
}) (*hier der Inhalt des Scripts*);
Warum verwendest du nicht einfach load, wenn du schon JQuery nutzt? Es macht genau das, was du willst. Eine Externe Ressource nachladen und evtl. vorhandene Scripte in dieser Ressource ausführen.
mfg
ich sehe da garkein jquery, nur teile aus jquery selber. Alles was mit jquery geht, kann man ja auch selber nachbauen. ich denke das tut er mit seinem code da auch!
ich sehe da garkein jquery, nur teile aus jquery selber. Alles was mit jquery geht, kann man ja auch selber nachbauen. ich denke das tut er mit seinem code da auch!
Richtig, die Seite nutzt kein jquery und nachdem der Traffic mit den Umbaumaßnahmen klein gehalten werden soll, wärs auch nicht zielführend es einzubauen.
Mich würde daran nur interessieren, was der Code window["eval"].call... genau macht.
window.eval() ist mir ein Begriff, aber window["eval"].call()?
Leider ist diese Syntax nicht Google-tauglich, so dass ich immer noch keinen Plan hab was ich da gemacht habe.
Hi,
window.eval() ist mir ein Begriff, aber window["eval"].call()?
Funktionsobjekte in Javascript haben eine Methode .call().
Der erste Parameter gibt an was this sein soll, die weiteren sind die Parameter die an die Funktion übergeben werden sollen.
window[ "eval" ].call( window, data );
macht das gleiche wie eval(data); im Globalen Scope auszuführen.
Eval is Evil!
Ich würde nach einer alternative suchen.
~dave
window[ "eval" ].call( window, data );
macht das gleiche wie eval(data); im Globalen Scope auszuführen.
Ich hab gesehen dass windows.eval ein bisschen anders ausgeführt wird als eval. Habs aber nicht ganz durchschaut, eval soll "lokal" sein und windows.eval dann halt global. Aber ohne Erklärung was das heißen könnte.
Eval is Evil!
Ich würde nach einer alternative suchen.
Und irgendwo stand dass bei diesem Aufruf wenigstens kein eval() verwendet wird, was man ja nicht verwenden soll?! Lustig.
Alternative hab ich keine gefunden. Ich war ja froh überhaupt mal das gefunden zu haben. Alle Suchergebnisse sind irgendwann mal bei jquery gelandet, daraus stammt ja mein Codefragment.
Kennst du eine?
Hallo dave,
Eval is Evil!
und wie willst du dann einen Javascript-String ausführen? Die von jquery scheinen es ja nicht so evil zu finden.
Gruß, Jürgen
Mich würde daran nur interessieren, was der Code window["eval"].call... genau macht.
window.eval() ist mir ein Begriff, aber window["eval"].call()?
Leider ist diese Syntax nicht Google-tauglich, so dass ich immer noch keinen Plan hab was ich da gemacht habe.
Wenn du keinen Plan hast, wie es geht, und keinen Plan hast, warum jQuery es so macht, wie es jQuery macht, dann solltest du in Gottes Namen jQuery verwenden, anstatt Bruchstücke herauszuziehen. Das meine ich nicht böse. In jQuery steckt JavaScript-Erfahrung, die man sich nicht mal eben aneignen kann.
Zu deiner Frage: Ja, richtig, es macht einen Unterschied, wie eval aufgerufen wird. Man will Code üblicherweise im globalen Scope ausführen, anstatt in dem Funktions-Scope, in dem der eval-Aufruf letztlich steckt. Dazu muss man eval indirekt aufrufen: http://perfectionkills.com/global-eval-what-are-the-options/
Mathias
Wenn du keinen Plan hast, wie es geht, und keinen Plan hast, warum jQuery es so macht, wie es jQuery macht, dann solltest du in Gottes Namen jQuery verwenden, anstatt Bruchstücke herauszuziehen.
Tu ich ja praktisch auch.
Ich lasse halt alles andere weg, das bei den Aufrufen nicht benötigt wird. Wenn man sich den Code durchschaut, sieht man doch schnell dass hier nur sehr wenige Funktionen beteiligt sind und dass in diesen auch nur ein paar "Äste" zum Einsatz kommen.