Prototipo Ajax.Updater Eval Funciones Javascript
-
06-07-2019 - |
Pregunta
Tengo esta página de muestra:
<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>
Lo llamo con esto:
new Ajax.Updater($(element), page, { method: "get", evalScripts: true });
La alerta se está ejecutando, pero la función no se está registrando (ajax_hello ()).
¿Hay alguna manera de hacer que ajax registre una función de JavaScript en la página de llamada?
Solución
En respuesta al comentario, examiné la documentación y parece que hay Hay algunas reglas especiales para Prototype cuando los scripts son evaluados por el actualizador. Los scripts pueden estar en cualquier parte de la respuesta, pero necesita asignar cualquier definición de función a una variable global para que esté disponible en su página.
Acerca de evalScripts y definición funciones Si usa evalScripts: cierto, cualquier bloque será evaluado. Esto no significa que lo hará ser incluido en la página: no lo harán. Su contenido simplemente se pasará a la función nativa eval (). Existen dos consecuencias para esto:
El alcance local será el de Procesamiento interno del prototipo función. Cualquier cosa en tu guión declarado con var será descartado momentáneamente después de la evaluación, y al cualquier tasa será invisible para el resto de los guiones de la página. Si tu definir funciones allí, necesita en realidad crearlos, de lo contrario no será accesible para el resto de los guiones de la página. Eso es el el siguiente código no funcionará:
// This kind of script won't work if processed by Ajax.Updater: function coolFunc() { // Amazing stuff! }
Tú necesitará usar la siguiente sintaxis:
// This kind of script WILL work if processed by Ajax.Updater: coolFunc = function() { // Amazing stuff! }