Генерация канонического / реального URL на основе base.href или местоположения - PullRequest
0 голосов
/ 14 мая 2010

Существует ли метод / функция для получения канонического / преобразованного URL-адреса с учетом любого параметра base.href на странице?

Я могу получить базовый URL через (в jQuery), используя $("base").attr("href"), и я могу использовать строковые методы для анализа URL, предназначенного для этого, но

  • $ ("base"). Attr ("href") не имеет атрибутов хоста, пути и т. Д. (Как у window.location)
  • ручная сборка довольно утомительна

Например, с учетом base.href "http://example.com/foo/" и относительного URL "/bar.js" результат должен быть: "http://example.com/bar.js"

Если base.href отсутствует, URL должен быть сделан относительно window.location. Это должно обрабатывать несуществующий файл base.href (в данном случае используется местоположение в качестве базы).

Есть ли уже стандартный метод для этого?

(Я ищу это, поскольку jQuery.getScript завершается ошибкой при использовании относительного URL-адреса, такого как "/foo.js", и используется тег BASE (FF3.6 делает запрос OPTIONS, а nginx не может это обработать). При использовании полного URL (base.href.host + "/foo.js", это работает).)

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Это делает трюк?

function resolveUrl(url){
    if (!url) {
        throw new Error("url is undefined or empty");
    }
    var reParent = /[\-\w]+\/\.\.\//, // matches a foo/../ expression 
 reDoubleSlash = /([^:])\/\//g; // matches // anywhere but in the protocol
    // replace all // except the one in proto with /
    url = url.replace(reDoubleSlash, "$1/");
    var base = (document.getElementsByTagName('BASE')[0] && document.getElementsByTagName('BASE')[0].href) || "";

    // If the url is a valid url we do nothing
    if (!url.match(/^(http||https):\/\//)) {
        // If this is a relative path
        var path = (url.substring(0, 1) === "/") ? base : location.pathname;
        if (path.substring(path.length - 1) !== "/") {
            path = path.substring(0, path.lastIndexOf("/") + 1);
        }
        if (!url.match(/^(http||https):\/\//)) {
            url = location.protocol + "//" + location.host + path + url;
        }
    }

    // reduce all 'xyz/../' to just '' 
    while (reParent.test(url)) {
        url = url.replace(reParent, "");
    }
    return url;
}

Он модифицирован из некоторого кода, который у меня был, поэтому он не был проверен

0 голосов
/ 13 января 2012

js-uri - полезная библиотека javascript для этого: http://code.google.com/p/js-uri/

Вам все равно придется обрабатывать части base.href против window.location, но остальное можно сделать с помощью библиотеки.

...