다음 http://site1.com/index.html
과 같이 파일에 myscript.js를 포함 합니다.
<script src=http://site2.com/myscript.js></script>
“myscript.js”에서 URL ” http://site2.com/myscript.js “에 액세스하고 싶습니다 . 다음과 같은 것을 갖고 싶습니다.
function getScriptURL() {
// something here
return s
}
alert(getScriptURL());
위에서 언급 한 index.html에서 호출하면 ” http://site2.com/myscript.js “를 경고 합니다.
답변
에서 http://feather.elektrum.org/book/src.html :
var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];
이제 변수 myScript
에 스크립트 dom 요소가 있습니다. 을 사용하여 src URL을 가져올 수 있습니다 myScript.src
.
이것은 스크립트의 초기 평가의 일부로 실행되어야합니다. Javascript 네임 스페이스를 오염시키지 않으려면 다음과 같이 할 수 있습니다.
var getScriptURL = (function() {
var scripts = document.getElementsByTagName('script');
var index = scripts.length - 1;
var myScript = scripts[index];
return function() { return myScript.src; };
})();
답변
스크립트 태그에 id 속성을 추가 할 수 있습니다 (헤드 태그 안에 있더라도).
<script id="myscripttag" src="http://site2.com/myscript.js"></script>
다음과 같이 src에 액세스합니다.
document.getElementById("myscripttag").src
물론 id 값은 스크립트를 포함하는 모든 문서에 대해 동일해야하지만 큰 불편은 없다고 생각합니다.
답변
IE를 제외한 모든 지원
document.currentScript
답변
지연 로딩 및 비동기 스크립트 태그로 작동하는 스크립트 경로를 찾기 위해 클래스를 작성했습니다.
스크립트와 관련된 템플릿 파일이 있었기 때문에 하드 코딩하는 대신 클래스를 만들어 경로를 자동으로 생성했습니다. 전체 소스는 여기 github에 있습니다.
얼마 전 나는 arguments.callee를 사용하여 비슷한 작업을 시도했지만 최근 MDN 에서 Strict 모드에서는 허용되지 않는다고 읽었습니다 .
function ScriptPath() {
var scriptPath = '';
try {
//Throw an error to generate a stack trace
throw new Error();
}
catch(e) {
//Split the stack trace into each line
var stackLines = e.stack.split('\n');
var callerIndex = 0;
//Now walk though each line until we find a path reference
for(var i in stackLines){
if(!stackLines[i].match(/http[s]?:\/\//)) continue;
//We skipped all the lines with out an http so we now have a script reference
//This one is the class constructor, the next is the getScriptPath() call
//The one after that is the user code requesting the path info (so offset by 2)
callerIndex = Number(i) + 2;
break;
}
//Now parse the string for each section we want to return
pathParts = stackLines[callerIndex].match(/((http[s]?:\/\/.+\/)([^\/]+\.js)):/);
}
this.fullPath = function() {
return pathParts[1];
};
this.path = function() {
return pathParts[2];
};
this.file = function() {
return pathParts[3];
};
this.fileNoExt = function() {
var parts = this.file().split('.');
parts.length = parts.length != 1 ? parts.length - 1 : 1;
return parts.join('.');
};
}
답변
jQuery를 사용할 기회가 있다면 코드는 다음과 같습니다.
$('script[src$="/myscript.js"]').attr('src');
답변
매우 잘 작동하는 간단하고 직접적인 솔루션 :
IE가 아니라면 document.currentScript
For IE를 사용할 수 있습니다 document.querySelector('script[src*="myscript.js"]')
.
function getScriptURL(){
var script = document.currentScript || document.querySelector('script[src*="myscript.js"]')
return script.src
}
답변
다음 코드를 사용하면 주어진 이름으로 스크립트 요소를 찾을 수 있습니다.
var scripts = document.getElementsByTagName( 'script' );
var len = scripts.length
for(var i =0; i < len; i++) {
if(scripts[i].src.search("<your JS file name") > 0 && scripts[i].src.lastIndexOf("/") >= 0) {
absoluteAddr = scripts[i].src.substring(0, scripts[i].src.lastIndexOf("/") + 1);
break;
}
}