¿Cómo puedo hacer referencia al elemento de script que cargó el javascript que se está ejecutando actualmente?
Aquí está la situación. Tengo un script "maestro" cargado en la parte superior de la página, lo primero bajo la etiqueta HEAD.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<script type="text/javascript" src="scripts.js"></script>
Hay un script en "scripts.js" que necesita poder cargar otros scripts a pedido. El método normal no funciona para mí porque necesito agregar nuevos scripts sin hacer referencia a la etiqueta HEAD, porque el elemento HEAD no ha terminado de renderizarse:
document.getElementsByTagName('head')[0].appendChild(v);
Lo que quiero hacer es hacer referencia al elemento de script que cargó el script actual para que luego pueda agregar mis nuevas etiquetas de script cargadas dinámicamente en el DOM después de él.
<script type="text/javascript" src="scripts.js"></script>
loaded by scripts.js--><script type="text/javascript" src="new_script1.js"></script>
loaded by scripts.js --><script type="text/javascript" src="new_script2.js"></script>
javascript
element
parent
Shog9
fuente
fuente
Respuestas:
Cómo obtener el elemento de script actual:
1. Uso
document.currentScript
document.currentScript
devolverá el<script>
elemento cuyo script se está procesando actualmente.Beneficios
defer
&async
)Problemas
<script type="module">
2. Seleccione script por id
Darle al script un atributo de id le permitirá seleccionarlo fácilmente por id desde dentro usando
document.getElementById()
.Beneficios
defer
&async
)Problemas
id
El atributo puede causar un comportamiento extraño para los scripts en algunos navegadores para algunos casos extremos3. Seleccione el script usando un
data-*
atributoDarle un
data-*
atributo al script le permitirá seleccionarlo fácilmente desde adentro.Esto tiene pocos beneficios sobre la opción anterior.
Beneficios
defer
&async
)Problemas
querySelector()
no es compatible con todos los navegadoresid
atributo<script>
conid
cajas de borde.4. Seleccione el script por src
En lugar de usar los atributos de datos, puede usar el selector para elegir el script por fuente:
En embed.js:
Beneficios
defer
&async
)Problemas
id
atributo5. Recorre todas las secuencias de comandos para encontrar la que deseas
También podemos recorrer cada elemento del script y verificar cada uno individualmente para seleccionar el que queremos:
Esto nos permite usar ambas técnicas anteriores en navegadores antiguos que no son compatibles
querySelector()
con los atributos. Por ejemplo:Esto hereda los beneficios y problemas de cualquier enfoque que se adopte, pero no depende de
querySelector()
eso, por lo que funcionará en navegadores más antiguos.6. Obtenga el último script ejecutado
Dado que las secuencias de comandos se ejecutan secuencialmente, el último elemento de secuencia de comandos con frecuencia será la secuencia de comandos que se está ejecutando actualmente:
Beneficios
Problemas
defer
Yasync
)fuente
script
setemplate
inserta en un DOM de sombraDado que los scripts se ejecutan secuencialmente, la etiqueta de script ejecutada actualmente es siempre la última etiqueta de script en la página hasta ese momento. Entonces, para obtener la etiqueta del script, puede hacer:
fuente
Probablemente lo más fácil sería darle a su etiqueta de scrip un
id
atributo .fuente
Las secuencias de comandos se ejecutan secuencialmente solo si no tienen un atributo "diferido" o "asíncrono". Conocer uno de los posibles atributos ID / SRC / TITLE de la etiqueta del script también podría funcionar en esos casos. Entonces, las sugerencias de Greg y Justin son correctas.
Ya hay una propuesta para un
document.currentScript
en las listas de WHATWG.EDITAR : Firefox> 4 ya implementa esta propiedad muy útil, pero no está disponible en IE11 la última vez que revisé y solo está disponible en Chrome 29 y Safari 8.
EDITAR : Nadie mencionó la colección "document.scripts", pero creo que lo siguiente puede ser una buena alternativa entre navegadores para obtener el script actualmente en ejecución:
fuente
Aquí hay un poco de un polyfill que aprovecha
document.CurrentScript
si existe y cae de nuevo a la búsqueda de la secuencia de comandos por ID.Si incluye esto en la parte superior de cada etiqueta de script, creo que podrá saber constantemente qué etiqueta de script se está activando, y también podrá hacer referencia a la etiqueta de script en el contexto de una devolución de llamada asincrónica.
Sin probar, así que deja comentarios para otros si lo intentas.
fuente
id
atributo no es válido en unscript
elemento. ¿Qué tipo de problemas podría generar este enfoque?id
atributo.id
,class
yslot
se definen en el nivel DOM, no en el nivel HTML. Si va a los atributos globales en HTML y se desplaza más allá de la lista, encontrará que "el estándar DOM define los requisitos de agente de usuario para los atributos de clase, id y slot para cualquier elemento en cualquier espacio de nombres". seguido de "Los atributos de clase, id y slot pueden especificarse en todos los elementos HTML". La especificación DOM lo cubre aquí .Debe funcionar al cargar la página y cuando se agrega una etiqueta de script con javascript (por ejemplo, con ajax)
fuente
Siga estos sencillos pasos para obtener referencias al bloque de script actual en ejecución:
Ejemplo (ABCDE345678 es la ID única) :
por cierto, para su caso, simplemente puede usar el método antiguo de document.write () para incluir otro script. Como mencionó que DOM aún no se procesa, puede aprovechar el hecho de que el navegador siempre ejecuta el script en secuencia lineal (excepto el diferido que se procesará más adelante), por lo que el resto de su documento aún "no existe". Todo lo que escriba a través de document.write () se colocará justo después del script de llamada.
Ejemplo de página HTML original :
Contenido de script.js :
Después de renderizado, la estructura DOM se convertirá en:
fuente
Un enfoque para tratar con scripts asíncronos y diferidos es aprovechar el controlador de carga: establecer un controlador de carga para todas las etiquetas de script y el primero que se ejecute debe ser suyo.
fuente
Para obtener el script, que actualmente cargó el script, puede usar
Debe mantener una referencia al comienzo de su secuencia de comandos, para poder llamar más tarde
fuente
Considera este algoritmo. Cuando se carga el script (si hay varios scripts idénticos), revise document.scripts, busque el primer script con el atributo "src" correcto, guárdelo y márquelo como 'visitado' con un atributo de datos o className único.
Cuando se carga el siguiente script, escanee nuevamente document.scripts, pasando sobre cualquier script ya marcado como visitado. Tome la primera instancia no visitada de ese script.
Esto supone que scripts idénticos probablemente se ejecutarán en el orden en que se cargan, de la cabeza al cuerpo, de arriba a abajo, de síncrono a asíncrono.
Esto buscará en todo el script el primer script coincidente que no esté marcado con el atributo especial.
Luego marque ese nodo, si lo encuentra, con un atributo de datos para que los escaneos posteriores no lo elijan. Esto es similar a los algoritmos transversales BFS y DFS del gráfico donde los nodos pueden marcarse como 'visitados' para evitar la revisión.
fuente
Tengo esto, que funciona en FF3, IE6 y 7. Los métodos en los scripts cargados a pedido no están disponibles hasta que se completa la carga de la página, pero esto sigue siendo muy útil.
fuente
Si puede asumir el nombre del archivo del script, puede encontrarlo. Hasta ahora solo he probado la siguiente función en Firefox.
fuente
He encontrado que el siguiente código es el más consistente, eficiente y simple.
fuente