Pergunta

Estou tentando fazer algo como um C #include "filename.c", ou PHP include(dirname(__FILE__)."filename.php") mas em javascript.Eu sei que posso fazer isso se conseguir o URL de onde um arquivo js foi carregado (por exemplo,o URL fornecido no atributo src da tag).Existe alguma maneira do javascript saber disso?

Alternativamente, existe alguma boa maneira de carregar javascript dinamicamente do mesmo domínio (sem conhecer especificamente o domínio)?Por exemplo, digamos que temos dois servidores idênticos (QA e produção), mas eles claramente possuem domínios de URL diferentes.Existe uma maneira de fazer algo como include("myLib.js"); onde myLib.js será carregado do domínio do arquivo que o carrega?

Desculpe se isso foi redigido de forma um pouco confusa.

Foi útil?

Solução

Dentro do roteiro:

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

Isso funciona porque o navegador carrega e executa scripts em ordem, portanto, enquanto seu script estiver em execução, o documento no qual ele foi incluído certamente terá seu elemento de script como o último na página.É claro que esse código deve ser 'global' para o script, então salve src algum lugar onde você possa usá-lo mais tarde.Evite o vazamento de variáveis ​​globais envolvendo-as em:

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

Outras dicas

Todos os navegadores, exceto o Internet Explorer (qualquer versão) document.currentScript, que sempre funciona sempre (não importa como o arquivo foi incluído (Async, Bookmarklet etc).

Se você quiser saber o URL completo do arquivo JS em que está agora:

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

Tadaa.

A resposta aceita aqui não funciona se você tiver scripts embutidos em seu documento. Para evitar isso, você pode usar o seguinte para segmentar apenas <script> tags com um [src] atributo.

/**
 * 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, '' );
}

Isso captura efetivamente o último arquivo .js externo, resolvendo alguns problemas que encontrei com os modelos JS em linha.

Acabei de fazer esse pequeno truque:

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

Trabalhe em: Chrome, Firefox, Edge

desfrutar !

Refinando as respostas encontradas aqui, criei o seguinte:

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: Estou usando Commonjsformato de módulo e agrupamento com webpack.

Mais recentemente, encontrei uma abordagem muito mais limpa para isso, que pode ser executada a qualquer momento, em vez de ser forçado a fazê -lo de maneira síncrona quando o script carrega.

Usar Stackinfo para obter um stacktrace em um local atual e pegue o info.file Nomeie o topo da pilha.

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

Codifiquei uma função simples que permite obter a localização absoluta do arquivo JavaScript atual, usando um método Try/Catch.

Você pode ver isso aqui.

Posso estar entendendo mal sua pergunta, mas parece que você deve usar um caminho relativo, desde que os servidores de produção e desenvolvimento usem a mesma estrutura de caminho.

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

Independentemente de ser um script, um arquivo html (para um quadro, por exemplo), arquivo css, imagem, qualquer que seja, se você não Especifique um servidor/domínio O caminho do documento html será o padrão, para que você possa fazer, por exemplo,

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

ou

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

Se você não fornecer o servidor/domínio, o caminho será relativo ao caminho da página ou script do caminho do documento principal

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top