Pregunta

Estoy tratando de hacer algo como un #include "filename.c" C, o include(dirname(__FILE__)."filename.php") PHP, pero en javascript. Sé que puedo hacer esto si puedo obtener la URL de un archivo js se cargó a partir de (por ejemplo, la URL dada en el atributo src de la etiqueta). ¿Hay alguna forma para el javascript para saber que?

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

Lo siento si eso es redactado un poco confusa.

¿Fue útil?

Solución

Dentro de la secuencia de comandos:

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

Esto funciona porque las cargas del navegador y ejecuta las secuencias de comandos en orden, así que mientras que la secuencia de comandos se ejecuta, el documento se incluyó en está seguro de tener el elemento de script como el último de la página. Este código, por supuesto, debe ser 'global' a la secuencia de comandos, así que guarda src algún lugar donde se puede utilizar más adelante. Evitar fugas variables globales envolviéndolo en:

(function() { ... })();

Otros consejos

Todos los navegadores excepto Internet Explorer (cualquier versión) Tienes 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.

La respuesta aceptada aquí no funciona si tiene secuencias de comandos en línea en el documento. Para evitar esto se puede utilizar el siguiente para sólo etiquetas <script> objetivo 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, '' );
}

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

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()())

 pantalla

Trabajo en: Chrome, Firefox, Borde

disfrutar!

Refinación en las respuestas que se encuentran aquí me ocurrió la siguiente:

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;

Por cierto: estoy usando CommonJS formato de módulo y empaquetado con webpack .

He encontrado más recientemente un enfoque mucho más limpio de esto, que puede ser ejecutado en cualquier momento, en lugar de verse obligados a hacerlo de forma sincrónica cuando se carga el script.

stackinfo para obtener una StackTrace en una ubicación actual, y agarrar el nombre info.file la parte superior de la pila.

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

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

Se puede ver aquí .

I puede ser mal entendido su pregunta, pero parece que sólo debe ser capaz de utilizar una ruta relativa, siempre y cuando los servidores de producción y desarrollo utilizan la misma estructura de ruta.

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

Independientemente de si es un guión, un archivo html (por un marco, por ejemplo), css, imagen, lo que sea, si Dont especifica un servidor / dominio de la ruta del documento html será el valor 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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top