Javascript 将部分URL扩展为完整URL(如在image.src中)
我正在尝试为图像编写一个Javascript 将部分URL扩展为完整URL(如在image.src中),javascript,Javascript,我正在尝试为图像编写一个onerror处理程序,用加载的图像替换它们,然后定期尝试重新加载它们。我遇到的问题是,如果加载映像失败,它将进入一个无限的失败循环。我试图通过检查URL是否为加载图像来解决此问题: if(photo.src != loadingImage) { // Try to reload the image } 不幸的是,loadingImage可以是一个相对的URL(/images/loadingImage.jpg),但是photo.src始终是一个完整的URL(ht
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
。约束条件是我对加载图像一无所知,只知道它是一个有效的URL(它可以是绝对的、相对于服务器的或相对于当前页面的)photo.src
可以是任何(绝对)URL,因此不一定与加载图像的位于同一个域上?照片应该是完整的URL或相对于当前文档的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;
}
这个怎么样?照片应该是完整的URL或相对于当前文档的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;
}
以下是人们在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
}
可能有一种更有效、更可靠的方法来使用正则表达式进行字符串操作,但这似乎在我的测试中完成了这项工作。以下是人们在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
}
可能有一种更有效、更可靠的方法来使用正则表达式进行字符串操作,但这似乎可以在我的测试中完成任务。只需检查它们是否以相同的字符串结束:
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);
只需检查它们是否以相同的字符串结尾:
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);
如何获取loadingImage
变量?函数如下所示:函数retryImage(photo,loadingImage){/*stuff*/}
。因此,loadingImage
可以是任何东西。只要loadingImage
是一个有效的URL,我就希望它能够工作。您说loadingImage和photo.src可能来自不同的域。如果loadingImage
是一个相对URL,并且不一定与photo.src
的域名相同,那么您如何知道它来自哪个域?是否有一个可以将其绑定回的源URL?如果没有,我不知道你是否能够完成你在这里要做的事情。@Joshua Carmoty:我编辑了这个问题,希望能让它更清楚。如果loadingImage
是一个相对URL,我希望它像其他URL一样处理(因此,如果它不包含方案,它是相对于当前页面或当前页面的服务器的)。如何获取loadingImage
变量?函数如下所示:函数retryImage(photo,loadingImage){/*stuff*/}
。因此,loadingImage
可以是任何东西。只要loadingImage
是一个有效的URL,我就希望它能够工作。您说loadingImage和photo.src可能来自不同的域。如果loadingImage
是一个相对URL,并且不一定与photo.src
的域名相同,那么您如何知道它来自哪个域?是否有一个可以将其绑定回的源URL?如果没有,我不知道你是否能够完成你在这里要做的事情。@Joshua Carmoty:我编辑了这个问题,希望能让它更清楚。如果loadingImage
是一个相对URL,我希望它能像其他URL一样被处理(因此,如果它不包含方案,它是相对于当前页面或当前页面的服务器的)。+1这在我的测试中起到了作用。但我会添加一个检查,以确保photo.src不会以“/”开头,以确保不会添加其中两个。比如url=location.href.substring(0,location.href.lastIndexOf('/'))+(photo.src.indexOf(“/”)==0?”:“/”+photo.src“代码>或者别的什么。@Joshua,有很多事情可以改进它;但是,如果url以“/”开头,则应该是服务器根目录下的绝对url,因此不应将其作为相对url处理。询问者给出的具体示例以“/”开头。它是相对的,因为它不包括域名和协议。@Joshua,你是对的,我说以/开头的URL不是相对的。不过,我不打算让它变得完美,特别是因为它可能会导致兔子洞+1,这在我的测试中奏效。但我会添加一个检查,以确保photo.src不会以“/”开头,以确保不会添加其中两个。比如url=location.href.substring(0,location.href.lastIndexOf('/'))+(photo.src.indexOf(“/”)==0?”:“/”+photo.src“代码>或者别的什么。@Joshua,有很多事情可以改进它;但是,如果url以“/”开头,则应该是服务器根目录下的绝对url,因此不应将其作为相对url处理。询问者给出的具体示例以“/”开头。它是相对的,因为它不包括域名和协议。@Joshua,你是对的,我错了说你