Cómo obtener el elemento de script actual:
1. Uso document.currentScript
document.currentScript
devolverá el <script>
elemento cuyo script se está procesando actualmente.
<script>
var me = document.currentScript;
</script>
Beneficios
- Simple y explícito. De confianza.
- No es necesario modificar la etiqueta del script
- Funciona con scripts asincrónicos (
defer
& async
)
- Funciona con scripts insertados dinámicamente.
Problemas
- No funcionará en navegadores antiguos e IE.
- No funciona con módulos.
<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()
.
<script id="myscript">
var me = document.getElementById('myscript');
</script>
Beneficios
- Simple y explícito. De confianza.
- Casi universalmente compatible
- Funciona con scripts asincrónicos (
defer
& async
)
- Funciona con scripts insertados dinámicamente.
Problemas
- Requiere agregar un atributo personalizado a la etiqueta del script
id
El atributo puede causar un comportamiento extraño para los scripts en algunos navegadores para algunos casos extremos
3. Seleccione el script usando un data-*
atributo
Darle un data-*
atributo al script le permitirá seleccionarlo fácilmente desde adentro.
<script data-name="myscript">
var me = document.querySelector('script[data-name="myscript"]');
</script>
Esto tiene pocos beneficios sobre la opción anterior.
Beneficios
- Simple y explícito.
- Funciona con scripts asincrónicos (
defer
& async
)
- Funciona con scripts insertados dinámicamente.
Problemas
- Requiere agregar un atributo personalizado a la etiqueta del script
- HTML5, y
querySelector()
no es compatible con todos los navegadores
- Menos compatible que usar el
id
atributo
- Se moverá
<script>
con id
cajas de borde.
- Puede confundirse si otro elemento tiene el mismo atributo y valor de datos en la página.
4. Seleccione el script por src
En lugar de usar los atributos de datos, puede usar el selector para elegir el script por fuente:
<script src="//example.com/embed.js"></script>
En embed.js:
var me = document.querySelector('script[src="//example.com/embed.js"]');
Beneficios
- De confianza
- Funciona con scripts asincrónicos (
defer
& async
)
- Funciona con scripts insertados dinámicamente.
- No se necesitan atributos personalizados o identificación
Problemas
- No no trabajar para los scripts locales
- Causará problemas en diferentes entornos, como Desarrollo y Producción
- Estática y frágil. Cambiar la ubicación del archivo de script requerirá modificar el script
- Menos compatible que usar el
id
atributo
- Causará problemas si carga el mismo script dos veces
5. 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:
<script>
var me = null;
var scripts = document.getElementsByTagName("script")
for (var i = 0; i < scripts.length; ++i) {
if( isMe(scripts[i])){
me = scripts[i];
}
}
</script>
Esto nos permite usar ambas técnicas anteriores en navegadores antiguos que no son compatibles querySelector()
con los atributos. Por ejemplo:
function isMe(scriptElem){
return scriptElem.getAttribute('src') === "//example.com/embed.js";
}
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:
<script>
var scripts = document.getElementsByTagName( 'script' );
var me = scripts[ scripts.length - 1 ];
</script>
Beneficios
- Sencillo.
- Casi universalmente compatible
- No se necesitan atributos personalizados o identificación
Problemas
- No no trabajar con secuencias de comandos asíncronos (
defer
Y async
)
- No no trabajar con guiones dinámicamente insertadas