0

是否有一种方法/功能来获取规范/转换的 URL,尊重页面的任何 base.href 设置?

我可以通过(在 jQuery 中)使用获取基本 URL,$("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 在使用像“/foo.js”这样的相对 URL 并且正在使用 BASE 标记时失败(FF3.6 发出 OPTIONS 请求,而 nginx 无法处理这个)。当使用完整的 URL(base.href.host + "/foo.js",它有效)。)

4

2 回答 2

2

这行得通吗?

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;
}

它是根据我周围的一些代码修改的,因此尚未经过测试

于 2010-05-14T17:36:19.890 回答
0

js-uri 是一个有用的 javascript 库来完成这个:http ://code.google.com/p/js-uri/

您仍然需要处理 base.href 与 window.location 部分,但其余部分可以通过库完成。

于 2012-01-13T18:34:05.530 回答