문제

나는 c와 같은 일을하려고 노력하고있다 #include "filename.c", 또는 PHP include(dirname(__FILE__)."filename.php") 그러나 JavaScript에서. URL을 얻을 수 있다면 A JS 파일이로드 된 경우 (예 : 태그의 SRC 속성에 주어진 URL)에서로드되었습니다. JavaScript가 그것을 알 수있는 방법이 있습니까?

또는 도메인을 구체적으로 알지 못하고 동일한 도메인에서 자바 스크립트를 동적으로로드하는 좋은 방법이 있습니까? 예를 들어, 두 개의 동일한 서버 (QA 및 생산)가 있지만 URL 도메인이 분명히 있다고 가정합니다. 같은 일을하는 방법이 있습니까? include("myLib.js"); MyLib.js는 어디에서로드하는 파일의 도메인에서로드됩니까?

조금 혼란스럽게 말하면 죄송합니다.

도움이 되었습니까?

해결책

스크립트 내에서 :

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

브라우저가 순서대로 스크립트를로드하고 실행하므로 스크립트가 실행되는 동안 포함 된 문서는 스크립트 요소를 페이지의 마지막 요소로 가야합니다. 이 코드는 물론 스크립트의 '글로벌'이어야하므로 저장하십시오. src 나중에 사용할 수있는 곳. 글로벌 변수가 누출되지 않도록하십시오.

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

다른 팁

Internet Explorer (모든 버전)를 제외한 모든 브라우저는 document.currentScript, 파일이 어떻게 포함 되든 항상 (비동기, 북마크 등) 항상 작동합니다.

JS 파일의 전체 URL을 알고 싶다면 지금 당장

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

Tadaa.

문서에 인라인 스크립트가있는 경우 여기서 허용 된 답변은 작동하지 않습니다. 이를 피하려면 다음을 사용하여 대상 만 사용할 수 있습니다. <script> A가있는 태그 [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, '' );
}

이는 마지막 외부 .js 파일을 효과적으로 캡처하여 인라인 JS 템플릿으로 직면 한 몇 가지 문제를 해결합니다.

방금이 작은 속임수를 만들었습니다.

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

작업 : Chrome, Firefox, Edge

즐겨 !

여기에서 발견 된 답변을 정제합니다.

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 : 사용 중입니다 commonjs모듈 형식 및 번들링 웹 팩.

나는 최근에 이것에 대한 훨씬 더 깨끗한 접근법을 발견했는데, 스크립트가로드 될 때 동기식으로 수행하지 않고 언제든지 실행할 수 있습니다.

사용 stackinfo 현재 위치에서 스택 트레이스를 얻고 info.file 스택 상단에서 이름을 지정하십시오.

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

시도/캐치 메소드를 사용하여 현재 JavaScript 파일의 절대 위치를 얻을 수있는 간단한 기능을 코딩했습니다.

당신은 그것을 볼 수 있습니다 여기.

나는 당신의 질문을 오해하고 있을지 모르지만 생산 및 개발 서버가 동일한 경로 구조를 사용하는 한 상대 경로를 사용할 수 있어야합니다.

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

스크립트, HTML 파일 (예 : 프레임), CSS 파일, 이미지, 뭐든지, 하지 않다 서버/도메인 지정 HTML 문서의 경로가 기본값이므로 예를 들어 할 수 있습니다.

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

또는

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

서버/도메인을 제공하지 않으면 경로는 페이지의 경로 또는 기본 문서 경로의 스크립트와 관련이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top