Frage

Ich versuche, so etwas wie ein C #include "filename.c" zu tun, oder PHP include(dirname(__FILE__)."filename.php") aber in Javascript. Ich weiß, ich kann dies tun, wenn ich die URL einer js-Datei aus (zum Beispiel der URL angegeben im src-Attribute des Tags) geladen wurde erhalten. Gibt es eine Möglichkeit für das Javascript, das zu wissen?

Alternativ ist es eine gute Möglichkeit dynamisch aus der gleichen Domäne zu laden Javascript (ohne die Domain zu wissen, speziell)? Zum Beispiel kann sagen, wir haben zwei identische Server (QA und Produktion), aber sie haben deutlich unterschiedliche URL-Domains. Gibt es eine Möglichkeit etwas wie include("myLib.js"); zu tun, wo myLib.js aus der Domäne der Datei Laden laden wird es?

Es tut uns Leid, wenn das ist ein wenig verwirrend formuliert.

War es hilfreich?

Lösung

Innerhalb des Skripts:

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

Das funktioniert, weil der Browser lädt und exekutiert Skripte um, also, während das Skript ausgeführt wird, das Dokument es aufgenommen wurde in sicher ist Ihr Script-Element als die letzten zu haben, auf der Seite. Dieser Code muss natürlich an das Skript ‚global‘ sein, so speichert src irgendwo, wo Sie es später verwenden können. Vermeiden Sie undichte globale Variablen durch das Einwickeln in:

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

Andere Tipps

Alle Browser außer Internet Explorer (alle Versionen) Gibt document.currentScript , die immer funktioniert immer (egal, wie die Datei (async, Bookmarklet usw.) enthalten war).

Wenn Sie die vollständige URL der JS-Datei wissen möchten Sie in diesem Augenblick sind:

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

Tadaa.

Die akzeptierte Antwort hier funktioniert nicht, wenn Sie in Ihrem Dokument Inline-Scripts haben. Um dies zu vermeiden können Sie das Folgende nur Ziel <script> Tags mit einem [src] Attribute verwenden.

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

Dies fängt effektiv die letzte externen JS-Datei, einige Probleme zu lösen ich mit Inline-JS-Vorlagen anzutreffen.

Ich habe gerade diesen kleinen Trick:

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

Die Arbeit an: Chrome, Firefox, Rand

genießen!

Refining auf die Antworten hier kam ich mit dem Follow-up:

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: Ich bin mit Commonjs Modulformat und die Bündelung mit webpack .

Ich habe festgestellt, in jüngster Zeit einen viel sauberen Ansatz dazu, die jederzeit ausgeführt werden kann, anstatt gezwungen zu sein, es synchron zu tun, wenn das Skript geladen wird.

Verwenden Sie Stack einen Stacktrace an einem aktuellen Standort zu erhalten, und ergreifen Sie die info.file Namen aus der Spitze von der Stapel.

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

Ich habe eine einfache Funktion codiert, die die absolute Position der aktuellen JavaScript-Datei erhalten können, indem Sie einen try / catch-Methode.

Sie können sehen, es hier .

ich Ihre Frage sein Missverständnis kann aber es scheint, sollen Sie nur in der Lage sein, einen relativen Pfad so lange zu verwenden, da der Produktions- und Entwicklungsserver die gleichen Weg Struktur verwendet werden.

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

Unabhängig davon, ob es ein Skript, eine HTML-Datei (für einen Rahmen, zum Beispiel), CSS-Datei, Bild, was auch immer, wenn Sie Sie nicht Geben Sie einen Server / Domain den Pfad des HTML-doc wird der Standard sein, könnten Sie dies tun, zum Beispiel,

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

oder

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

Wenn Sie den Server / Domain nicht zur Verfügung stellen, wird der Pfad entweder auf den Pfad der Seite oder das Skript des Hauptdokuments Pfad relativ sein

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top