2010-02-12 22 views
44

Estoy intentando hacer algo como C #include "filename.c", o PHP include(dirname(__FILE__)."filename.php") pero en javascript. Sé que puedo hacer esto si puedo obtener la URL de la que se cargó un archivo js (por ejemplo, la URL que figura en el atributo src de la etiqueta). ¿Hay alguna forma de que el javascript lo sepa?Cómo obtener la ruta de acceso del código javascript que se está ejecutando actualmente

Alternativamente, ¿hay alguna buena manera de cargar javascript dinámicamente desde el mismo dominio (sin conocer específicamente el dominio)? Por ejemplo, supongamos que tenemos dos servidores idénticos (control de calidad y producción) pero claramente tienen diferentes dominios URL. ¿Hay alguna manera de hacer algo como include("myLib.js"); donde myLib.js se cargará desde el dominio del archivo que lo está cargando?

Lo siento si eso está redactado un poco confusamente.

Respuesta

67

Dentro de la secuencia de comandos:

var scripts = document.getElementsByTagName("script"), 
    src = scripts[scripts.length-1].src; 

Esto funciona porque el navegador carga y ejecuta las secuencias de comandos en orden, de modo que, mientras se ejecuta su secuencia de comandos, el documento en el que se incluyó seguramente tendrá su elemento de secuencia de comandos como el último en la página. Este código, por supuesto, debe ser 'global' para el script, así que guarde 'src' en algún lugar donde pueda usarlo más tarde. Evitar fugas variables globales envolviéndolo en:

(function() { ... })(); 
+4

Esta es una gran sugerencia, siempre que el código en el script se ejecute "en línea" (es decir, en un contexto global o "método anónimo de ejecución inmediata", como ha sugerido, y no en un "llamado posterior") función o set-timeout). Puede crear una var en cada javascript para el archivo/ruta actual de esta manera. Sin embargo, hay que tener en cuenta que las "variables globales que se escapan" no se pueden resolver con lo que he llamado métodos de ejecución inmediata, '(función() {...})();' - su ejemplo anterior aún creará una var global llamado 'src' porque no tiene un especificador' var' antes que – Graza

+0

Eso es bastante brillante. Un problema es que si uso el método getScript de jquery, falla (vuelve en blanco). Alguna solucion a eso? –

+4

Hay un especificador var para 'src' (vea la coma al final de la primera línea) – InfinitiesLoop

1

Es posible que esté malinterpretando su pregunta, pero parece que solo debe poder utilizar una ruta relativa, siempre que los servidores de producción y desarrollo utilicen la misma estructura de ruta.

 
<script language="javascript" src="js/myLib.js" /> 
+2

El problema es que esta biblioteca javascript está pensada para cargarse en diferentes dominios. –

+0

Entonces, ¿se trata de un archivo de biblioteca js único ubicado en un dominio que debe extraerse en varios dominios? ¿O se trata de un archivo js que reside en varios dominios que necesitan extraer otros archivos js en relación con su origen? ¿Podría darnos un ejemplo de lo que está tratando de lograr? – johnmdonahue

+0

Es ambos en realidad. El archivo js residirá en múltiples dominios (QA vs producción), y también se incluirá desde múltiples dominios (cualquier aplicación web necesita usar la biblioteca). –

0

Independientemente de si es un guión, un archivo html (por un marco, por ejemplo), css, imagen, lo que sea, si no te especificar un servidor/dominio de la ruta del documento HTML que sea el predeterminado, por lo que podría hacer, por ejemplo,

<script type=text/javascript src='/dir/jsfile.js'></script>

o

<script type=text/javascript src='../../scripts/jsfile.js'></script>

Si usted no proporciona el servidor/dominio, la ruta será relativa a la ruta de acceso de la página o la escritura de la trayectoria del documento principal

24

todos los navegadores excepto Internet Explorer (cualquier versión) tienen document.currentScript, que siempre funciona siempre (no importa cómo se incluyó el archivo (asíncrono, bookmarklet, etc)).

Si desea conocer la dirección URL completa del archivo JS estás en este momento:

var script = document.currentScript; 
var fullUrl = script.src; 

Tadaa.

+0

¡Esto es asombroso y exactamente lo que esperaba encontrar! – Markus

+0

¡Gracias, finalmente encuentro la solución! – Alcalyn

3

Recientemente, he encontrado un enfoque mucho más limpio, que se puede ejecutar en cualquier momento, en lugar de tener que hacerlo de forma síncrona cuando se carga el script.

Usa stackinfo para obtener un stacktrace en una ubicación actual y toma el nombre info.file de la parte superior de la pila.

info = stackinfo() 
console.log('This is the url of the script '+info[0].file) 
14

La respuesta aceptada aquí no funciona si tiene scripts en línea en su documento.Para evitar esto, puede usar lo siguiente para solo apuntar a las etiquetas <script> con un atributo [src].

/** 
* Current Script Path 
* 
* Get the dir path to the currently executing script file 
* which is always the last one in the scripts array with 
* an [src] attr 
*/ 
var currentScriptPath = function() { 

    var scripts = document.querySelectorAll('script[src]'); 
    var currentScript = scripts[ scripts.length - 1 ].src; 
    var currentScriptChunks = currentScript.split('/'); 
    var currentScriptFile = currentScriptChunks[ currentScriptChunks.length - 1 ]; 

    return currentScript.replace(currentScriptFile, ''); 
} 

captura Esto efectivamente el último archivo .js externos, la solución de algunos problemas que me encontré con plantillas JS en línea.

+0

¡Funciona muy bien! ¡¡¡Gracias!!!. He encontrado y probado muchas soluciones sin un resultado positivo. – MarianoVolker

2

He codificado una función simple que permite obtener la ubicación absoluta del archivo javascript actual, utilizando un método try/catch.

Lo puedes ver en here.

+0

¿Por qué votar? Considera agregar un comentario también ... De todos modos. –

+3

Porque según las reglas se supone que debes explicar la solución en tu respuesta, no solo el enlace. Si ese enlace muere, tu respuesta no tiene sentido. –

+0

Esto es increíble, gracias por compartir. Además, podría hacer una comprobación de 'document.currentScript' solo en caso de que _se_ haya definido. – alecov

3

purificador en las respuestas que se encuentran aquí me ocurrió con las siguientes:

getCurrentScript.js

var getCurrentScript = function() { 
    if (document.currentScript) { 
    return document.currentScript.src; 
    } else { 
    var scripts = document.getElementsByTagName('script'); 
    return scripts[scripts.length-1].src; 

    } 
}; 

module.exports = getCurrentScript; 

getCurrentScriptPath.js

var getCurrentScript = require('./getCurrentScript'); 

var getCurrentScriptPath = function() { 
    var script = getCurrentScript(); 
    var path = script.substring(0, script.lastIndexOf('/')); 
    return path; 
}; 

module.exports = getCurrentScriptPath; 

BTW: Estoy usando CommonJS formato de módulo y paquete ling con webpack.

3

acabo de hacer este pequeño truco:

window.getRunningScript =() => { 
    return() => { 
     let err = new Error() 
     let link = err.stack.split('(') 
     link = link[1] 
     link = link.split(')')[0] 
     link = link.split(':') 
     link.splice(-2, 2) 
     link = link.join(':') 

     return link 
    } 
} 

console.log('%c Currently running script:', 'color: blue', getRunningScript()()) 

screenshot

El trabajo en: Chrome, Firefox, Borde

disfrutar!

Cuestiones relacionadas