Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 当网站返回带有404响应代码的假图像时,我如何使用自己的图像_Javascript_Html_Image - Fatal编程技术网

Javascript 当网站返回带有404响应代码的假图像时,我如何使用自己的图像

Javascript 当网站返回带有404响应代码的假图像时,我如何使用自己的图像,javascript,html,image,Javascript,Html,Image,这与通常关于如何在javascript中优雅地处理损坏的图像的问题有些不同 我已经在映像上有一个OneError处理程序,它将用自定义的“未找到映像”映像替换它 但是,有一个站点,当您请求他们的映像时,它返回404响应代码,但在响应体中,它实际返回一个带有自己自定义未找到映像的映像。显然,在这种情况下不会触发img onerror事件,因为尽管有错误代码,仍然存在图像。(我在FireFox、IE8和Chrome上进行了测试) 下面是一个有问题的图像示例: 有人知道如何用javascript检测这

这与通常关于如何在javascript中优雅地处理损坏的图像的问题有些不同

我已经在映像上有一个OneError处理程序,它将用自定义的“未找到映像”映像替换它

但是,有一个站点,当您请求他们的映像时,它返回404响应代码,但在响应体中,它实际返回一个带有自己自定义未找到映像的映像。显然,在这种情况下不会触发img onerror事件,因为尽管有错误代码,仍然存在图像。(我在FireFox、IE8和Chrome上进行了测试)

下面是一个有问题的图像示例:


有人知道如何用javascript检测这种情况并用我们自己的404动态图像替换它们吗?谢谢

想到的一个简单解决方案是不要立即加载图像,然后在document.ready或window.onload中使用javascript获取图像。然后,如果状态为404,则将您自己的noImageAvailable.png放入图像中。如果您获得200或其他OK状态,请将收到的图像放入其中。然而,这有一个问题

同源策略不允许脚本跨域访问内容。因此,您不能简单地使用javascript获取此文件。有两种解决方法,我将在这里解释其中一种(不一定是最好的,只是一种选择)

这种方法的好处是javascript可以只请求一个文件,并显示结果。缺点是更多的后端代码。只需让javascript从服务器(AJAX)请求图像,并将结果插入img即可。在该请求的服务器端,打开一个TCP套接字到承载映像的服务器(您必须解析IP地址),然后发送一个HTTP GET请求以获取映像。如果图像返回正常,则将其作为响应发送给AJAX。如果没有,请将您自己的noImageAvailable.png发回

由于这可能需要一些时间,您可能希望首先用默认的“加载”图像替换图像,直到AJAX返回


我想为您提供一些关于socket编程的内容,但我不知道您使用的是哪种后端。

您请求/接收图像的代码是什么?
您愿意使用AJAX来获取图像吗?编辑:在我提问前12秒给了我一个答案。然后我在看到你的回答之前删除了我的评论:)(由于跨域的原因,在没有测试的情况下,我不确定我是否可以使用ajax),但最初的评论表明,对于这个用例,我无法使用ajax加载所有图像,也不要在通过ajax.Hahaha加载后再次检查每个文件。好的,那么你想使用普通的img标记,并且可能在标记中使用一点javascript,对吗?谢谢@Jim。是的,你所描述的解决方案在技术上是可行的,但考虑到图像的数量,不幸的是,对于我的情况来说,这是不现实的。除了负载和性能问题,它还可能触发第三方映像主机的拒绝服务/爬虫检测算法,因为所有映像都将从单个IP加载。(不,我不想加入代理:)