2010-02-12 6 views
44

Ich versuche, etwas wie ein C #include "filename.c" oder PHP include(dirname(__FILE__)."filename.php") aber in Javascript zu tun. Ich weiß, dass ich das tun kann, wenn ich die URL bekomme, von der eine js-Datei geladen wurde (z. B. die URL, die im src-Attribut des Tags angegeben ist). Gibt es eine Möglichkeit für das Javascript das zu wissen?Wie bekomme ich den Dateipfad des gerade laufenden Javascript-Codes

Alternativ gibt es eine gute Möglichkeit, JavaScript dynamisch aus der gleichen Domäne zu laden (ohne die Domäne genau zu kennen)? Nehmen wir zum Beispiel an, wir haben zwei identische Server (QA und Produktion), aber sie haben eindeutig unterschiedliche URL-Domains. Gibt es eine Möglichkeit, etwas wie include("myLib.js"); zu tun, wo myLib.js von der Domäne der Datei geladen wird, die es lädt?

Sorry, wenn das ein wenig verwirrend formuliert ist.

Antwort

67

Innerhalb des Skripts relativ sein:

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

Dies funktioniert, weil Der Browser lädt Skripte und führt sie in der richtigen Reihenfolge aus. Während das Skript ausgeführt wird, hat das Dokument, in das es eingefügt wurde, sicher, dass das Skriptelement das letzte auf der Seite ist. Dieser Code muss natürlich für das Skript "global" sein, also speichern Sie "src" irgendwo, wo Sie es später verwenden können. Vermeiden Sie undichte globale Variablen durch das Einwickeln in:

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

Dies ist ein großartiger Vorschlag, solange der Code im Skript "inline" ausgeführt wird (dh in einem globalen Kontext oder "sofort ausgeführt anonyme Methode", wie Sie vorgeschlagen haben, und nicht in einem "später aufgerufen" Funktion oder Set-Timeout). Sie könnten auf diese Weise in jedem Javascript eine Variable für die aktuelle Datei/Pfad erstellen. Vorsichtig aber, "undichte globale Variablen" können nicht durch das, was ich sofort-run-anon-Methoden genannt habe, gelöst werden. '(Function() {...})();' - Ihr Beispiel oben erstellt immer noch eine globale Variable 'src' genannt, weil es keinen' var'-Spezifizierer davor hat – Graza

+0

Das ist ziemlich genial. Ein Problem besteht darin, dass es fehlschlägt, wenn ich die Methode "jetScript" von jQuery verwende. Irgendeine Lösung dafür? –

+4

Es gibt einen Var-Spezifizierer für 'src' (siehe Komma am Ende der ersten Zeile) – InfinitiesLoop

1

Ich mag Ihre Frage missverstehen, aber es scheint, dass Sie nur in der Lage sein sollten, einen relativen Pfad zu verwenden, solange die Produktions- und Entwicklungsserver dieselbe Pfadstruktur verwenden.

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

Das Problem ist, dass diese JavaScript-Bibliothek auf verschiedenen Domänen geladen werden soll. –

+0

Also ist dies eine einzelne js-Bibliotheksdatei, die sich in einer Domäne befindet, die über mehrere Domänen hinweg abgerufen werden muss? Oder ist das eine js-Datei, die sich auf mehreren Domains befindet, die andere js-Dateien relativ zu ihrer Quelle einbinden müssen? Können Sie ein Beispiel dafür nennen, was Sie erreichen möchten? – johnmdonahue

+0

Es ist beides tatsächlich. Die js-Datei befindet sich auf mehreren Domains (QA vs. Produktion) und wird auch aus mehreren Domains eingebunden (unabhängig davon, welche Web-App die Bibliothek benötigt). –

0

Unabhängig davon, ob es ein Skript, eine HTML-Datei (für einen Rahmen, zum Beispiel), CSS-Datei, Bild, was auch immer, wenn Sie einen Server/Domain den Pfad des html doc angeben nicht wird sein der Standard, so dass Sie könnte 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

24

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

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.

+0

Das ist genial und genau das, was ich zu finden hoffte! – Markus

+0

Danke, ich finde endlich die Lösung! – Alcalyn

3

Ich habe in jüngerer Zeit einen viel saubereren Ansatz gefunden, der jederzeit ausgeführt werden kann, anstatt gezwungen zu sein, synchron zu arbeiten, wenn das Skript geladen wird.

Verwenden Sie stackinfo, um einen Stacktrace an einer aktuellen Position zu erhalten, und greifen Sie den Namen info.file von der Spitze des Stapels.

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

Die hier angenommene Antwort funktioniert nicht, wenn Sie Inline-Skripts in Ihrem Dokument haben.Um dies zu vermeiden, können Sie Folgendes verwenden, um nur <script> Tags mit einem [src]-Attribut zu targetieren.

Dies erfasst effektiv die letzte externe .js-Datei und löst einige Probleme, die ich bei Inline-JS-Vorlagen hatte.

+0

Funktioniert gut !!!. Vielen Dank!!!. Ich habe viele Lösungen gefunden und ausprobiert, ohne ein positives Ergebnis zu haben. – MarianoVolker

2

Ich habe eine einfache Funktion geschrieben, die es erlaubt, die absolute Position der aktuellen Javascript-Datei zu erhalten, indem ich eine try/catch-Methode verwende.

Sie können es sehen here.

+0

Warum unten abstimmen? Erwäge, einen Kommentar hinzuzufügen. Wie auch immer. –

+3

Denn nach den Regeln soll man die Lösung in Ihrer Antwort erklären, nicht nur verlinken. Wenn diese Verbindung abbricht, ist Ihre Antwort bedeutungslos. –

+0

Das ist großartig, danke fürs Teilen. Sie können auch nach 'document.currentScript' suchen, für den Fall, dass es definiert ist. – alecov

3

auf die Antworten Verfeinerung gefunden hier kam ich mit den folgenden:

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 Modul-Format und Bund ling mit webpack.

3

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

Arbeiten an: Chrome, Firefox, Rand

genießen!