¿Cuándo se ejecuta realmente un script DOM cargado por jQuery / Ajax?

Ok, me siento un poco tonto al tener que preguntar esto. Hay muchas respuestas a preguntas similares, pero parece que no puedo hacerlo bien. Si modifico el DOM a través de jQuery / Ajax, ¿cuándo se analiza / ejecuta realmente un script cargado?

El siguiente código funciona en F / F, pero no en Chrome u Opera. 'Trabajando' significa que ejecuta 'do_init ()' sin error. La secuencia de comandos cargada (en realidad, un archivo svg; 'file.svg') define un número de variables que son requeridas por 'do_init ()' (que está en la secuencia de comandos 'estática'). Estas variables son visibles para F / F, pero no para Chrome u Opera ("la variable xxx no está definida"). El archivo / script se cargó correctamente en el DOM en los 3 casos y contiene un <svg>, Con un <script> dentro de eso.

Puedo hacer que esto funcione (las pantallas svg) en Opera (o romper en F / F) reorganizando el código, pero no en Chrome. Usar .success y .complete no hace ninguna diferencia.

Gracias.

<head>
...
<script type="text/javascript" src="do_init.js"></script>          
<script type="text/javascript"><![CDATA[
jQuery(document).ready(function() {
   ...
   $("#submit").click(function(e){
      e.preventDefault();
      var jqxhr =
         $("#svg").html(ajax_load).load("file.svg", function(response, status, xhr) {
            if(status == "error") {
               var msg = "Error: ";
               $("#error").html(msg + xhr.status + " " + xhr.statusText);
            } else {
               do_init(); // Ok in F/F, not in Chrome/Opera
            }
      });
   });
});
]]></script>
</head>
<body>
<button id="submit" type="button">Click Me!</button>
<div id="svg"></div>
</body>

EDIT 1

Resulta que nunca se ejecutan, al menos en IE9, FF8, Chrome, Opera y Safari. Ellos son ejecutado en FF7. Acabo de escribir una página de prueba mínima que hace una carga Ajax de un script que es solo una alerta. Esto solo muestra una alerta en FF7. También probé el guión envuelto en un <svg>, que no hace ninguna diferencia.

preguntado el 08 de noviembre de 11 a las 15:11

Es posible que desee intentar usar $ .get () en lugar de load (). Si bien la documentación de jQuery afirma que los scripts se ejecutan a menos que le des a load () un objetivo, he tenido problemas para cargar scripts usando load () que no tenía usando $ .get () -

En su lugar, intenté obtener, pero tengo problemas para cargar el DOM con la respuesta; esto es fácil con la carga. Volveré a publicar si puedo cargar el DOM y ver si hace una diferencia ... -

1 Respuestas

Esta es parte de la razón por la que se recomienda que ubique javascript al final del documento, al final del cuerpo.

Generalmente, javascript se ejecuta a medida que se encuentra; si lo coloca en la parte superior del documento, se ejecutará al principio del proceso de carga, tarde si se encuentra al final. Sin embargo, cuando se usa la funcionalidad "onLoad" o "domReady" de una biblioteca, posterga la ejecución para más adelante.

Consulte los documentos de jQuery para obtener más información: http://api.jquery.com/ready/

Si bien JavaScript proporciona el evento de carga para ejecutar código cuando se representa una página, este evento no se activa hasta que todos los activos, como las imágenes, se hayan recibido por completo. En la mayoría de los casos, el script se puede ejecutar tan pronto como la jerarquía DOM se haya construido por completo. Se garantiza que el controlador pasado a .ready () se ejecutará después de que DOM esté listo, por lo que este suele ser el mejor lugar para adjuntar todos los demás controladores de eventos y ejecutar otro código jQuery. Cuando se utilizan scripts que dependen del valor de las propiedades de estilo CSS, es importante hacer referencia a hojas de estilo externas o incrustar elementos de estilo antes de hacer referencia a los scripts.

EDITAR He leído mal los detalles de tu pregunta. Un script cargado dinámicamente se analiza inmediatamente, pero el onLoad El evento puede (¡o no!) ser disparado de acuerdo con el aspecto de transporte HTTP del script cargado en lugar de según la interpretación del script cargado. Por lo general, esto está bien (aunque algunos navegadores no activan el evento de manera confiable, IE, mirándote), pero el tiempo que buscas no es cuando se ha obtenido el script, sino cuando en realidad está analizado y activo. Estos deben estar en milisegundos, lo que generalmente hace que la diferencia no tenga sentido.

Hay algunas perspectivas diferentes para resolver problemas con esta técnica, algunas de las cuales se discuten aquí y aquí Sin embargo, ninguno parece mencionar específicamente a Chrome como una fuente de problemas. Dicho esto, el enfoque sugerido de sondeo para el script incluido (a través de un tiempo de espera) parece ser el menos propenso a fallar de las sugerencias, aunque también es la solución que menos me gusta.

respondido 08 nov., 11:22

Sin embargo, no estoy realmente seguro de que esto sea relevante. Por lo que puedo ver, los eventos ready y load solo son relevantes cuando el documento se carga inicialmente. Una vez que el evento se ha disparado, eso es todo; no creo que tengan ningún valor para los scripts cargados dinámicamente posteriores. ¿O son? - EML

Gracias Chris, solo estoy pasando por eso ahora. Mientras tanto, hice una observación interesante, agregada como edición # 1 arriba. - EML

Creo que tiene razón: getScript es el camino a seguir. Tuve que reorganizar todo para asegurarme de que la llamada Ajax solo obtenga un script, y nada de DOM, y puse la llamada do_init al final del script cargado, y que todo funcione de manera consistente. Gracias. - EML

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.