Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将部分URL扩展为完整URL(如在image.src中)_Javascript - Fatal编程技术网

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,你是对的,我错了说你