【问题标题】:Expand partial URL into full (like in image.src)将部分 URL 扩展为完整的(如 image.src 中)
【发布时间】:2011-08-12 10:09:35
【问题描述】:

我正在尝试为图像编写一个onerror 处理程序,用加载图像替换它们,然后定期尝试重新加载它们。我遇到的问题是,如果加载图像无法加载,它会进入无限循环的失败。我正在尝试通过检查 URL 是否是加载图像来处理这个问题:

if(photo.src != loadingImage) {
    // Try to reload the image
}

很遗憾,loadingImage 可以是相对 URL (/images/loadingImage.jpg),但 photo.src 始终是完整 URL (http://example.com/images/loadingImage.jpg)。有没有办法在不向函数传递更多信息的情况下生成这个完整的 URL?显然我可以将主机名传递给它,或者需要完整的 URL,但我希望让这个函数的界面尽可能简单。

编辑:

基本上我想要保证如果我这样做photo.src = loadingImage,这将是真的:photo.src === loadingImage。限制是我对loadingImage 一无所知,除了它是一个有效的 URL(它可以是绝对的、相对于服务器或相对于当前页面)。 photo.src 可以是任何(绝对)URL,因此不一定与 loadingImage 在同一个域中。

【问题讨论】:

  • 你是如何获得loadingImage 变量的?
  • 函数如下所示:function retryImage(photo, loadingImage) { /* stuff */ }。所以loadingImage 可以是任何东西。我希望它在 loadingImage 是有效 URL 时工作。
  • 你说 loadingImage 和 photo.src 可能来自不同的域。如果loadingImage 是一个相对URL,并且不一定与photo.src 同一个域名,你怎么知道它来自哪个域?是否有可以将其绑定回的源 URL?如果没有,我不知道您是否能够完成您在这里尝试做的事情。
  • @Joshua Carmody:我编辑了这个问题,希望能更清楚。如果 loadingImage 是一个相对 URL,我希望它像任何其他 URL 一样被处理(所以如果它不包含方案,它是相对于当前页面或当前页面的服务器)。

标签: javascript


【解决方案1】:

以下是人们用来在 javascript 中将相对 URL 转换为绝对 URL 的几种方法:

或者,您是否考虑过相反的做法 - 将绝对 URL 转换为相对 URL?如果loadingimage 总是包含 URL 的整个路径部分,那么这样的事情可能会起作用:

var relativePhotoSrc = photo.src;
if (relativePhotoSrc.indexOf("/") > 0 && relativePhotoSrc.indexOf("http://") == 0) {
    relativePhotoSrc = relativePhotoSrc.replace("http://", "");
    relativePhotoSrc = relativePhotoSrc.substring(relativePhotoSrc.indexOf("/"), relativePhotoSrc.length);
}
alert(relativePhotoSrc);
if (relativePhotoSrc != loadingImage && photo.src != loadingImage) {
    // Try to reload the image
}

可能有一种更有效/更可靠的方法来使用正则表达式进行字符串操作,但这似乎可以在我的测试中完成工作。

【讨论】:

  • 感谢您的链接。我考虑过将绝对 URL 转换为相对 URL,但不一定两个图像都在同一个域上(在这种情况下恰好是这种情况)。
  • 第一个链接中的 document.createElement("a") 技巧看起来应该可以满足我的要求。
【解决方案2】:

这个怎么样?照片应该是完整的 URL 或相对于当前文档。

var url;
// There probably other conditions to add here to make this bullet proof
if (photo.src.indexOf("http://") == 0 || 
    photo.src.indexOf("https://") == 0 || 
    photo.src.indexOf("//") == 0) {
  url = photo.src;
} else {
  url = location.href.substring(0, location.href.lastIndexOf('/')) + "/" + photo.src;
}

【讨论】:

  • +1 这在我的测试中有效。但我会添加一个检查以确保 photo.src 尚未以“/”开头,以确保您没有添加其中两个。比如url = location.href.substring(0, location.href.lastIndexOf('/')) + (photo.src.indexOf("/") == 0 ? "" : "/") + photo.src; 什么的。
  • @Joshua,可以做很多事情来改进它;但是,如果 url 以“/”开头,则它应该是来自服务器根目录的绝对 URL,因此不应将其视为相对 URL。
  • 提问者给出的具体示例以“/”开头。它是相对的,不包括域名和协议。
  • @Joshua,你是对的,我错了说以 / 开头的 URL 不是相对的。不过,我不会试图让它变得完美,特别是因为它可能会导致兔子洞
【解决方案3】:

只需检查它们是否以相同的字符串结尾:

var u1 = '/images/loadingImage.jpg';
var u2 = 'http://example.com/images/loadingImage.jpg'

var len = Math.min(u1.length, u2.length);
var eq = u1.substring(u1.length - len) == u2.substring(u2.length - len);

【讨论】:

  • 这些 URL 不需要具有相同的域名,因此将它们都设为相对是行不通的。
猜你喜欢
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
相关资源
最近更新 更多