¿Cómo puede cargar de manera confiable y dinámica un archivo JavaScript? Esto se puede utilizar para implementar un módulo o componente que, cuando se 'inicialice', el componente cargará dinámicamente todos los scripts de biblioteca JavaScript necesarios bajo demanda.
No es necesario que el cliente que usa el componente cargue todos los archivos de script de la biblioteca (e inserte <script>
etiquetas manualmente en su página web) que implementen este componente, solo el archivo de script del componente 'principal'.
¿Cómo logran esto las bibliotecas principales de JavaScript (Prototype, jQuery, etc.)? ¿Estas herramientas combinan múltiples archivos JavaScript en una única versión redistribuible de 'construcción' de un archivo de script? ¿O hacen alguna carga dinámica de scripts de 'biblioteca' auxiliares?
Una adición a esta pregunta: ¿hay alguna forma de manejar el evento después de cargar un archivo JavaScript incluido dinámicamente? Prototipo tiene document.observe
para eventos de todo el documento. Ejemplo:
document.observe("dom:loaded", function() {
// initially hide all containers for tab content
$$('div.tabcontent').invoke('hide');
});
¿Cuáles son los eventos disponibles para un elemento de script?
fuente
Respuestas:
Puede escribir etiquetas de script dinámico (usando Prototype ):
El problema aquí es que no sabemos cuándo el archivo de script externo está completamente cargado.
A menudo queremos nuestro código dependiente en la siguiente línea y nos gusta escribir algo como:
Hay una forma inteligente de inyectar dependencias de script sin la necesidad de devoluciones de llamada. Simplemente tiene que extraer el script a través de una solicitud AJAX sincrónica y evaluar el script a nivel global.
Si usa Prototype, el método Script.load se ve así:
fuente
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)web.archive.org
.No hay importación / incluir / requerir en javascript, pero hay dos formas principales de lograr lo que desea:
1 - Puede cargarlo con una llamada AJAX y luego usar eval.
Esta es la forma más directa, pero está limitada a su dominio debido a la configuración de seguridad de Javascript, y el uso de eval abre la puerta a errores y piratas informáticos.
2 - Agregue una etiqueta de script con la URL del script en el HTML.
Definitivamente el mejor camino a seguir. Puede cargar el script incluso desde un servidor externo, y está limpio a medida que usa el analizador del navegador para evaluar el código. Puede poner la etiqueta en el encabezado de la página web o en la parte inferior del cuerpo.
Ambas soluciones se discuten e ilustran aquí.
Ahora, hay un gran problema que debes conocer. Hacer eso implica que cargue el código de forma remota. Los navegadores web modernos cargarán el archivo y seguirán ejecutando su script actual porque cargan todo de forma asincrónica para mejorar el rendimiento.
Significa que si usa estos trucos directamente, no podrá usar su código recién cargado la siguiente línea después de que solicitó que se cargue, porque todavía se cargará.
Por ejemplo: my_lovely_script.js contiene MySuperObject
Luego vuelve a cargar la página presionando F5. ¡Y funciona! Confuso...
Entonces, ¿qué hacer al respecto?
Bueno, puedes usar el truco que sugiere el autor en el enlace que te di. En resumen, para las personas que tienen prisa, usa un evento para ejecutar una función de devolución de llamada cuando se carga el script. Para que pueda poner todo el código usando la biblioteca remota en la función de devolución de llamada. P.EJ :
Luego escribe el código que desea usar DESPUÉS de que el script se carga en una función lambda:
Entonces ejecutas todo eso:
Ok, lo tengo Pero es un dolor escribir todo esto.
Bueno, en ese caso, puede usar como siempre el fantástico framework jQuery gratuito, que le permite hacer lo mismo en una línea:
fuente
Utilicé una versión mucho menos complicada recientemente con jQuery :
Funcionó muy bien en todos los navegadores en los que lo probé: IE6 / 7, Firefox, Safari, Opera.
Actualización: versión sin jQuery:
fuente
$.getScript
. Mira mi respuesta.Básicamente hice lo mismo que hiciste Adam, pero con una ligera modificación para asegurarme de que estaba agregando a la etiqueta de la cabeza para hacer el trabajo. Simplemente creé una función de inclusión (código a continuación) para manejar archivos de script y css.
Esta función también verifica para asegurarse de que el script o el archivo CSS no se haya cargado dinámicamente. No verifica los valores codificados a mano y puede haber habido una mejor manera de hacerlo, pero sirvió para el propósito.
fuente
otra respuesta asombrosa
https://stackoverflow.com/a/950146/671046
fuente
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Aquí hay un código de ejemplo que he encontrado ... ¿Alguien tiene una mejor manera?
fuente
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Si ya tiene jQuery cargado, debe usar $ .getScript .
Esto tiene una ventaja sobre las otras respuestas aquí en que tiene una función de devolución de llamada integrada (para garantizar que el script se cargue antes de que se ejecute el código dependiente) y puede controlar el almacenamiento en caché.
fuente
Si desea cargar un script SYNC , debe agregar el texto del script directamente a la etiqueta HEAD HTML. Agregarlo como activará una carga ASYNC . Para cargar el texto del script desde un archivo externo sincrónicamente, use XHR. Debajo de una muestra rápida (está usando partes de otras respuestas en esta y otras publicaciones):
fuente
Creo que solo agregar el script al cuerpo sería más fácil que agregarlo al último nodo de la página. Qué tal esto:
fuente
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)He usado otra solución que encontré en la red ... esta está bajo creativecommons y comprueba si la fuente se incluyó antes de llamar a la función ...
Puede encontrar el archivo aquí: include.js
fuente
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)Acabo de enterarme de una gran característica en YUI 3 (en el momento de la escritura disponible en versión preliminar). Puede insertar fácilmente dependencias en bibliotecas YUI y en módulos "externos" (lo que está buscando) sin demasiado código: YUI Loader .
También responde a su segunda pregunta sobre la función que se llama tan pronto como se carga el módulo externo.
Ejemplo:
Funcionó perfectamente para mí y tiene la ventaja de administrar dependencias. Consulte la documentación de YUI para ver un ejemplo con el calendario YUI 2 .
fuente
Hay un nuevo estándar ECMA propuesto llamado importación dinámica , recientemente incorporado en Chrome y Safari.
fuente
La técnica que utilizamos en el trabajo es solicitar el archivo javascript usando una solicitud AJAX y luego evaluar () la devolución. Si está utilizando la biblioteca de prototipos, admiten esta funcionalidad en su llamada Ajax.Request.
fuente
jquery resolvió esto por mí con su función .append () : lo usé para cargar el paquete completo de jquery ui
Para usar : en el encabezado de su html / php / etc después de importar jquery.js, simplemente incluiría este archivo para cargarlo en la totalidad de su biblioteca y agregarlo al encabezado ...
fuente
¡Mantenlo agradable, corto, simple y fácil de mantener! :]
Este código es simplemente un breve ejemplo funcional que podría requerir funcionalidades de funciones adicionales para un soporte completo en cualquier plataforma (o dada).
fuente
La importación del módulo dinámico aterrizó en Firefox 67+ .
Con manejo de errores:
También funciona para cualquier tipo de bibliotecas que no sean módulos, en este caso, la lib está disponible en el objeto de ventana, a la antigua usanza, pero solo a pedido, lo cual es bueno.
Ejemplo usando suncalc.js , ¡el servidor debe tener CORS habilitado para funcionar de esta manera!
https://caniuse.com/#feat=es6-module-dynamic-import
fuente
Hay scripts diseñados específicamente para este propósito.
yepnope.js está integrado en Modernizr, y lab.js es una versión más optimizada (pero menos amigable para el usuario).
No recomendaría hacer esto a través de una gran biblioteca como jquery o prototipo, porque uno de los principales beneficios de un cargador de scripts es la capacidad de cargar scripts temprano, no debería tener que esperar hasta que jquery y todos sus elementos dom se carguen antes ejecutando una comprobación para ver si desea cargar dinámicamente un script.
fuente
Escribí un módulo simple que automatiza el trabajo de importar / incluir scripts de módulos en JavaScript. Pruébalo y por favor ahorra algunos comentarios! :) Para obtener una explicación detallada del código, consulte esta publicación de blog: http://stamat.wordpress.com/2013/04/12/javascript-require-import-include-modules/
fuente
Estoy perdido en todas estas muestras, pero hoy necesitaba cargar un .js externo desde mi .js principal e hice esto:
fuente
Aquí hay uno simple con devolución de llamada y soporte de IE:
fuente
Sé que mi respuesta es un poco tarde para esta pregunta, pero aquí hay un gran artículo en www.html5rocks.com : sumérgete en las aguas turbias de la carga de guiones .
En ese artículo se concluye que, en lo que respecta al soporte del navegador, la mejor manera de cargar dinámicamente el archivo JavaScript sin bloquear la representación del contenido es la siguiente:
Teniendo en cuenta que tiene cuatro scripts nombrados
script1.js, script2.js, script3.js, script4.js
, puede hacerlo aplicando async = false :Ahora, Spec dice : Descargar juntos, ejecutar en orden tan pronto como se descargue todo.
Firefox <3.6, Opera dice: No tengo idea de qué es esta cosa "asíncrona", pero sucede que ejecuto scripts agregados a través de JS en el orden en que se agregaron.
Safari 5.0 dice: Entiendo "async", pero no entiendo configurarlo en "false" con JS. Ejecutaré tus scripts tan pronto como lleguen, en cualquier orden.
IE <10 dice: No tengo idea sobre "async", pero hay una solución alternativa usando "onreadystatechange".
Todo lo demás dice: soy tu amigo, vamos a hacer esto según el libro.
Ahora, el código completo con IE <10 solución alternativa:
Algunos trucos y minificación más tarde, son 362 bytes.
fuente
Algo como esto...
fuente
Aquí un ejemplo simple para una función para cargar archivos JS. Puntos relevantes:
$.ajax
o$.getScript
puede usar nonces, resolviendo así los problemas con CSPunsafe-inline
. Solo usa la propiedadscript.nonce
Ahora lo usas simplemente por
fuente
Una frase absurda, para aquellos que piensan que cargar una biblioteca js no debería tomar más de una línea de código: P
Obviamente, si el script que desea importar es un módulo, puede usar la
import(...)
función.fuente
Con Promesas puedes simplificarlo así. Función del cargador:
Uso (asíncrono / espera):
Uso (promesa):
NOTA: había una solución similar pero no comprueba si el script ya está cargado y carga el script cada vez. Este comprueba la propiedad src.
fuente
Todas las principales bibliotecas de JavaScript como jscript, prototype, YUI tienen soporte para cargar archivos de script. Por ejemplo, en YUI, después de cargar el núcleo, puede hacer lo siguiente para cargar el control de calendario
fuente
He modificado algunas de las publicaciones anteriores con un ejemplo de trabajo. Aquí podemos dar css y js en la misma matriz también.
fuente
Para aquellos de ustedes que aman las frases sencillas:
Es probable que obtenga un error, como:
En cuyo caso, puede recurrir a:
fuente