Hay un div llamado "Contenido":
<div id="content"></div>
Debe llenarse con datos de un archivo PHP, por AJAX, incluida una <script>
etiqueta. Sin embargo, el script dentro de esta etiqueta no se está ejecutando.
<div id="content"><!-- After AJAX loads the stuff that goes here -->
<script type="text/javascript">
//code
</script>
<!-- More stuff that DOES work here -->
</div>
javascript
html
ajax
JCOC611
fuente
fuente
window.onload
crear unXMTHttpRequest
objeto para solicitar otra página (php) que contenga el contenido del div, incluido un script. Estoy haciendo esto con JS simple, sin bibliotecas (que no sean las mías)Respuestas:
JavaScript insertado como texto DOM no se ejecutará. Sin embargo, puede utilizar el patrón de secuencia de comandos dinámica para lograr su objetivo. La idea básica es mover el script que desea ejecutar a un archivo externo y crear una etiqueta de script cuando obtenga su respuesta Ajax. Luego establece el
src
atributo de su etiqueta de script y listo, carga y ejecuta el script externo.Esta otra publicación de StackOverflow también puede serle útil: ¿Se pueden insertar scripts con innerHTML? .
fuente
$('#audit-view script').each(function (index, element) { eval(element.innerHTML); })
Usé este código, está funcionando bien
fuente
Si carga un bloque de script dentro de su div a través de Ajax como este:
... simplemente actualiza el DOM de su página, myFunction () no necesariamente se llama.
Puede usar un método de devolución de llamada Ajax como el del método ajax () de jQuery para definir qué ejecutar cuando finalice la solicitud.
Lo que está haciendo es diferente a cargar una página con JavaScript incluido desde el principio (que se ejecuta).
Un ejemplo de cómo utilizar la devolución de llamada exitosa y la devolución de llamada de error después de obtener algún contenido:
Otra manera rápida y sucia es usar eval () para ejecutar cualquier código de script que haya insertado como texto DOM si no desea usar jQuery u otra biblioteca.
fuente
Aquí está el script que evaluará todas las etiquetas del script en el texto.
Simplemente llame a esta función después de recibir su HTML del servidor. Tenga cuidado: el uso
eval
puede ser peligroso.Demostración: http://plnkr.co/edit/LA7OPkRfAtgOhwcAnLrl?p=preview
fuente
Esto 'simplemente funciona' para mí usando jQuery, siempre que no intente agregar un subconjunto del HTML devuelto por XHR al documento. (Vea este informe de errores que muestra el problema con jQuery).
Aquí hay un ejemplo que muestra cómo funciona:
Aquí está el equivalente de lo anterior: http://jsfiddle.net/2CTLH/
fuente
Aquí hay una función que puede usar para analizar las respuestas AJAX, especialmente si usa minifiedjs y desea que ejecute el Javascript devuelto o simplemente desea analizar los scripts sin agregarlos al DOM, también maneja errores de excepción. Usé este código en la biblioteca php4sack y es útil fuera de la biblioteca.
fuente
Si está inyectando algo que necesita la etiqueta de secuencia de comandos, es posible que obtenga un error de sintaxis no detectado y diga token ilegal . Para evitar esto, asegúrese de escapar de las barras diagonales en sus etiquetas de script de cierre. es decir;
Lo mismo ocurre con cualquier etiqueta de cierre, como una etiqueta de formulario.
fuente
Tenía una publicación similar aquí, addEventListener load on ajax load SIN jquery
La forma en que lo resolví fue insertar llamadas a funciones dentro de mi función stateChange. La página que configuré tenía 3 botones que cargarían 3 páginas diferentes en contentArea. Como tenía que saber qué botón se estaba presionando para cargar la página 1, 2 o 3, podría usar fácilmente las declaraciones if / else para determinar qué página se está cargando y luego qué función ejecutar. Lo que estaba tratando de hacer era registrar diferentes oyentes de botones que solo funcionarían cuando se cargó la página específica debido a los ID de los elementos.
entonces...
si (se está cargando la página1, carga de la página = 1) ejecutar la función registerListeners1
luego lo mismo para la página 2 o 3.
fuente
Esto funcionó para mí llamando a eval en cada contenido de script desde ajax .done:
fuente
Mi conclusión es que HTML no permite etiquetas NESTED SCRIPT. Si está utilizando javascript para inyectar código HTML que incluye etiquetas de script en su interior, no funcionará porque el javascript también va en una etiqueta de script. Puedes probarlo con el siguiente código y verás que no va a funcionar. El caso de uso es que está llamando a un servicio con AJAX o similar, está obteniendo HTML y desea inyectarlo en HTML DOM directamente. Si el código HTML inyectado tiene etiquetas SCRIPT dentro, no va a funcionar.
fuente
Otra cosa a hacer es cargar la página con un script como:
Esto cargará la página, luego ejecutará el script y eliminará el controlador de eventos cuando se haya ejecutado la función. Esto no se ejecutará inmediatamente después de una carga ajax, pero si está esperando que el usuario ingrese el elemento div, esto funcionará bien.
PD. Requiere Jquery
fuente