2009년 6월 12일 금요일

javascript에서 js 파일 자체의 파일명을 알애내는 방법

BBCode for TiStory 3.1을 개발하는 과정에서 js 파일이 저장된 폴더를 알아내야 했다.

지금까지는 각 이미지의 절대주소를 코드 안에 넣어뒀는데, 이제는 그럴 수 없게 되었기 때문이다.
그 전까진 내 전용 코드에만 추가적인 이미지를 사용했는데, 이제 이모티콘이 추가됨으로써 그런 주먹구구는 버려야 했기 때문.

그래서, 일단, js 파일 자체의 이름을 알아내는 방법을 찾아봤다.
우선 찾은 방법은 아래와 같은 코드이다.

getCurrentPath: function()
{
    var GetCurPath = (function(){
        var RandID = "SID" + Math.round(100000*Math.random());
        document.write("<script id='"+RandID+"'></script>");
        return document.getElementById(RandID).previousSibling.getAttribute("src");
    })()
    return GetCurPath;
}

이 코드를 js 파일에 추가한 뒤에 getCurrentPath() 함수를 호출하면 js 파일 자체의 이름이 리턴된다.

이 함수는 깔끔하고 명확하기는 하지만, 약간의 부담스러운 점이 있다.
내용이 텅 비긴 했지만, SID로 시작하는 임의의 스크립트를 하나 만든다는 것이다.

아무것도 추가하지 않는 방법을 찾아보니 아래와 같은 방법을 찾을 수 있었다.

getCurrentPath: function()
{
    var scr=document.getElementsByTagName('script');
    return(scr[scr.length-1].getAttribute("src"));
}

약간 복잡하기는 하지만, 이 함수는 IE8, FF3, Chrome2 에서 정상동작하는 것을 확인했다.
(물론 앞의 함수 역시 각 브라우저들에서 잘 동작한다)
이 코드 역시 js 파일에 추가한 뒤에 getCurrentPath() 함수를 호출하면 js 파일 자체의 이름이 리턴된다.

이렇게 js 파일 자체의 파일명을 얻었으면, 다음은 간단하다.
아래와 같이 getCurrentPath() 뒤에 간단한 정규식 함수 하나만 달아주면 된다.

alert(getCurrentPath().match(/^(.*)\/([^\/]*)$/i)[1]+'/');

덧. 이 함수는 html 파일 내에 위치하면 안된다.
두 getCurrentPath() 모두 html 내에서는 null을 리턴하기 때문이다.


댓글 2개:

  1. 역시나 까막눈으로는 봐도 뭔 소린지~ OTL

    답글삭제
  2. @miru - 2009/06/13 06:01
    '천리길도 한 걸음부터...' 조금씩 읽어보시면 재미있답니다.

    답글삭제