Domanda

sto cercando di fare qualcosa di simile a #include "filename.c" C, o PHP include(dirname(__FILE__)."filename.php") ma in javascript. So che posso fare questo se posso ottenere l'URL di un file js è stato caricato da (ad esempio l'URL specificato nel l'attributo src del tag). C'è un modo per il javascript sapere che?

In alternativa, c'è qualche buon modo per caricare javascript dinamicamente dallo stesso dominio (senza conoscere il dominio specifico)? Ad esempio, supponiamo di avere due server identici (QA e produzione) ma hanno chiaramente diversi domini URL. C'è un modo per fare qualcosa di simile include("myLib.js"); dove myLib.js caricheranno dal dominio del file di caricarla?

Ci dispiace se questo è un po 'confusamente formulate.

È stato utile?

Soluzione

All'interno dello script:

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

Questo funziona perché il browser carica ed esegue gli script in ordine, così mentre lo script è in esecuzione, il documento è stato incluso in è sicuro di avere il vostro elemento script come l'ultimo nella pagina. Questo codice, naturalmente, deve essere 'globale' per lo script, in modo da salvare src da qualche parte dove è possibile utilizzare in un secondo momento. Evitare perdite variabili globali avvolgendolo in:

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

Altri suggerimenti

Tutti i browser tranne Internet Explorer (qualsiasi versione) hanno document.currentScript , che funziona sempre sempre (non importa quanto il file è stato incluso (asincrona, bookmarklet ecc)).

Se vuoi conoscere l'URL completo del file JS siete in questo momento:

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

Tadaa.

La risposta accettata qui non funziona se si dispone di script in linea nel documento. Per evitare questo è possibile utilizzare il seguente ai soli tag bersaglio <script> con un attributo [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, '' );
}

Questa cattura efficacemente l'ultimo file .js esterni, la risoluzione di alcuni problemi che ho incontrato con linea modelli JS.

Ho appena fatto questo piccolo trucco:

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

I lavori per: Chrome, Firefox, Riva

godere!

Raffinazione seconda delle risposte trovate qui mi si avvicinò con il seguente:

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;

A proposito: sto usando CommonJS formato del modulo e l'abbinamento con webpack .

Non ho più recentemente trovato un approccio molto più pulito di questo, che può essere eseguito in qualsiasi momento, piuttosto che essere costretti a farlo in modo sincrono quando i carichi di script.

stackinfo per ottenere uno stacktrace in una posizione corrente, e afferrare il nome info.file fuori dalla parte superiore della lo stack.

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

Ho codificato una semplice funzione che permette di ottenere la posizione assoluta della corrente file javascript, utilizzando un metodo try / catch.

Lo si può vedere qui .

I può essere equivoco tua domanda, ma sembra si dovrebbe solo essere in grado di utilizzare un percorso relativo fino a quando i server di produzione e di sviluppo utilizzano la stessa struttura del percorso.

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

Indipendentemente dal fatto che la sua uno script, un file html (per una cornice, per esempio), file css, immagine, qualunque cosa, se Non specificare un server / dominio il percorso del documento html sarà il default, in modo che si possa fare, per esempio,

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

o

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

Se non si dispone di un server / dominio, il percorso sarà relativo sia al percorso della pagina o lo script del percorso del documento principale

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top