2012-02-21 8 views
7

Me he dado cuenta de que algunos scripts parecen ser llamados antes que otros en una página determinada, me preguntaba, ¿cuál es el orden específico para cargar los scripts? In-page antes de hacer referencia a los scripts .js? ¿Se ejecutan en orden desde el primer <script> mencionado en último lugar en la página o depende del navegador? ¿Cómo se puede asegurar que un script específico se ejecute primero en una página?Asegúrese de que primero se ejecuta una secuencia de comandos de Javascript?

Respuesta

4

He notado que algunas secuencias de comandos parecen ser llamadas antes que otras en una cierta página de . Me preguntaba, ¿cuál es el orden específico para cargar los scripts?

Esto es configurado por W3C en sus especificaciones de idioma. Para el HTML 4.01 Specification, por ejemplo, se define en Section 18.2.4 Dynamic modification of documents, item 1.

¿In-page antes de hacer referencia a los scripts .js?

Ver más arriba. No, las secuencias de comandos en línea y vinculadas se manejan de manera idéntica.

Son corren con el fin de mencionado en primer lugar a la última en la página, o es esto depende del explorador?

Las especificaciones requieren que se ejecuten secuencialmente de arriba hacia abajo. Deberá encontrar un navegador que implemente el idioma de acuerdo con las especificaciones. No puedo pensar en ningún otro momento que maneje etiquetas SCRIPT de manera diferente, pero estoy seguro de que es posible.

Otra cosa a considerar es la definición de "ejecutar". Eso puede sonar como un análisis semántico, pero no lo es. JavaScript, como cualquier lenguaje de programación, está diseñado para comportarse de acuerdo con los estándares. JavaScript se especifica en el ECMA-262 5.1 Edition/June 2011 standard para evaluar de izquierda a derecha en la Sección 7 Convenciones léxicas. (Las terminaciones de línea se tratan como el carácter más a la izquierda de la siguiente línea). Este documento también proporciona convenciones para el orden en que se evalúan las instrucciones y otras operaciones, como las sentencias WHILE o FOR.

¿Cómo se puede asegurar que un script específico se ejecute primero en una página?

(1) Colóquelo en la parte superior, y (2) elija un navegador que implemente las especificaciones del idioma.

Sin embargo, creo que puede haber algo más detrás de esta pregunta. Si intenta evitar que se ejecute código inesperado, deberá bloquearlo hasta que el controlador de eventos ONLOAD registre que la página está completa. (Simplemente encierre sus operaciones en una función o rodeelas con un IF para verificar si hay un indicador booleano, es decir, isLoaded se establece como verdadero mediante ONLOAD.) Luego, cuando el controlador de eventos ONLOAD se active, puede iniciar operaciones en su propio calendario sin tener que preocuparse por cosas como objetos DOM desinstalados.

9

Mientras no se carguen dinámicamente los scripts o se marquen como async o diferir, los scripts se ejecutan o evalúan en el orden que se encuentra en la página. Entonces, los primeros scripts encontrados se ejecutan primero.

Un archivo de script de referencia externa que debe cargarse hará que toda la ejecución de JavaScript espere hasta que el archivo referenciado externamente se cargue y analice y se ejecute.

Por lo tanto, el orden de evaluación del javascript normal (no asincrónico, no diferido) es 100% determinado según el orden en que se encuentra en la página.

+0

Proporcione una referencia de la edición ECMA-262 5+ que declara que este es el comportamiento especificado según los estándares. ¿Estás seguro de que funciona de esta manera en todos los navegadores y plataformas y no es solo una casualidad? – ingyhere

+0

@ingyhere - No sé dónde hay una referencia, no tengo tiempo para mirar en este momento. Este es el CAMINO en el que funciona el javascript: si tiene alguna razón para impugnarlo, indique ese motivo. Javascript se ejecuta desde arriba/abajo. Tiene que ser consistente en todos los navegadores o se romperán muchas páginas porque la gente confía en que JavaScript se ejecuta de arriba a abajo todo el tiempo. Prácticamente cualquier idioma tiene que ofrecer un orden de ejecución garantizado entre diferentes partes del código, porque a menudo se requiere para hacer que su lógica funcione. – jfriend00

+0

Aquí hay una referencia: http://docstore.mik.ua/orelly/webprog/jscript/ch12_03.htm – jfriend00

5

De forma predeterminada, las etiquetas script se descargan y se evalúan secuencialmente tal como se encuentran en un documento HTML.

Sin embargo, si utiliza los atributos async o defer, la ejecución se realiza después de que el script finaliza la descarga (asincrónico) o cuando la página finaliza la carga (aplazamiento).

+0

No cuente con la ejecución de aplazamiento del atributo * aplazar * hasta después del análisis (de lo contrario sería una buena alternativa a la carga y los eventos listos). En HTML 4, [defer] (http://www.w3.org/TR/html401/interact/scripts.html#adef-defer) era solo una pista de que el script no creaba contenido para que el navegador pudiera seguir cargando mientras lo ejecuta. En HTML5, [diferir] (http://www.w3.org/TR/html5/scripting-1.html#attr-script-defer) significa "esperar hasta que el análisis haya terminado". HTML5 no está lo suficientemente respaldado como para que se pueda confiar en el comportamiento especificado, tal vez desde hace algunos años. – RobG

1

Los scripts se ejecutan en el orden en que se evalúan en el archivo html, tal como lo leería de arriba hacia abajo.

Sin embargo, async y defer pueden anular esto para los navegadores que tienen implementados.

Cuestiones relacionadas