Prototype Ajax.Updater Eval Javascript-Funktionen
-
06-07-2019 - |
Frage
Ich habe diese Beispielseite:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Ajax Page</title>
<script type="text/javascript">
function ajax_hello() {
alert ("hello");
}
alert ("Hello from JS");
</script>
</head>
<body>
This is the Ajax page.
<a href='#' onclick='ajax_hello();'>Click here to fire off JS function</a>.
</body>
</html>
Ich rufe es mit diesem:
new Ajax.Updater($(element), page, { method: "get", evalScripts: true });
Der Alarm läuft, aber die Funktion Registrierung ist nicht (ajax_hello ()).
Gibt es eine Möglichkeit Ajax zu bekommen eine Javascript-Funktion an die aufrufende Seite registrieren?
Lösung
Als Reaktion auf den Kommentar, stieß ich auf der Dokumentation und es scheint, dass es sind einige spezielle Regeln für Prototype, wenn Scripts durch den Updater ausgewertet werden. Die Skripte können überall in der Antwort sein, und Sie müssen alle Funktionsdefinitionen zu einer globalen Variablen zugewiesen werden, um sie auf Ihre Seite zur Verfügung zu stellen.
Über evalScripts und definierende Funktionen Wenn Sie evalScripts: true, wird jeder Block sein bewertet. Dies bedeutet nicht, es wird erhalten in der Seite enthalten: sie werden nicht. Ihr Inhalt wird einfach werden weitergegeben die native Funktion eval (). Es gibt zwei Folgen dies:
Der lokale Bereich wird sein, dass die Prototype interne Verarbeitung Funktion. Alles, was in Ihrem Skript erklärt mit var wird verworfen kurz nach der Auswertung, und bei jedenfalls wird die unsichtbar Rest der Seite Skripte. Wenn du definieren Funktionen dort, müssen Sie sie tatsächlich schaffen, sonst wird nicht an den Rest zugänglich sein der Seite Skripte. Das heißt, die folgender Code wird nicht funktionieren:
// This kind of script won't work if processed by Ajax.Updater: function coolFunc() { // Amazing stuff! }
Sie müssen Sie die folgende Syntax verwenden:
// This kind of script WILL work if processed by Ajax.Updater: coolFunc = function() { // Amazing stuff! }