Convert relative path to absolute using JavaScript

后端 未结 11 1566
误落风尘
误落风尘 2020-11-28 05:15

There\'s a function, which gives me urls like:

./some.css
./extra/some.css
../../lib/slider/slider.css

It\'s always a relative path.

<
11条回答
  •  囚心锁ツ
    2020-11-28 05:37

    The proposed and accepted solution does not support server relative URLs and does not work on absolute URLs. If my relative is /sites/folder1 it won't work for example.

    Here is another function that supports full, server relative or relative URLs as well as ../ for one level up. It is not perfect but covers a lot of options. Use this when your base URL is not the current page URL, otherwise there are better alternatives.

        function relativeToAbsolute(base, relative) {
        //make sure base ends with /
        if (base[base.length - 1] != '/')
            base += '/';
    
        //base: https://server/relative/subfolder/
        //url: https://server
        let url = base.substr(0, base.indexOf('/', base.indexOf('//') + 2));
        //baseServerRelative: /relative/subfolder/
        let baseServerRelative = base.substr(base.indexOf('/', base.indexOf('//') + 2));
        if (relative.indexOf('/') === 0)//relative is server relative
            url += relative;
        else if (relative.indexOf("://") > 0)//relative is a full url, ignore base.
            url = relative;
        else {
            while (relative.indexOf('../') === 0) {
                //remove ../ from relative
                relative = relative.substring(3);
                //remove one part from baseServerRelative. /relative/subfolder/ -> /relative/
                if (baseServerRelative !== '/') {
                    let lastPartIndex = baseServerRelative.lastIndexOf('/', baseServerRelative.length - 2);
                    baseServerRelative = baseServerRelative.substring(0, lastPartIndex + 1);
                }
            }
            url += baseServerRelative + relative;//relative is a relative to base.
        }
    
        return url;
    }
    

    Hope this helps. It was really frustrating not to have this basic utility available in JavaScript.

提交回复
热议问题