可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Using javascript is there a way to tell if a resource is available on the server? For instance I have images 1.jpg - 5.jpg loaded into the html page. I\'d like to call a JavaScript function every minute or so that would roughly do the following scratch code...
if \"../imgs/6.jpg\" exists:
var nImg = document.createElement(\"img6\");
nImg.src = \"../imgs/6.jpg\";
Thoughts? Thanks!
回答1:
You could use something like:
function imageExists(image_url){
var http = new XMLHttpRequest();
http.open(\'HEAD\', image_url, false);
http.send();
return http.status != 404;
}
Obviously you could use jQuery/similar to perform your HTTP request.
$.get(image_url)
.done(function() {
// Do something now you know the image exists.
}).fail(function() {
// Image doesn\'t exist - do something else.
})
回答2:
You can use the basic way image preloaders work to test if an image exists.
function checkImage(imageSrc, good, bad) {
var img = new Image();
img.onload = good;
img.onerror = bad;
img.src = imageSrc;
}
checkImage(\"foo.gif\", function(){ alert(\"good\"); }, function(){ alert(\"bad\"); } );
JSFiddle
回答3:
You can just check if the image loads or not by using the built in events that is provided for all images.
The onload
and onerror
events will tell you if the image loaded successfully or if an error occured :
var image = new Image();
image.onload = function() {
// image exists and is loaded
document.body.appendChild(image);
}
image.onerror = function() {
// image did not load
var err = new Image();
err.src = \'/error.png\';
document.body.appendChild(err);
}
image.src = \"../imgs/6.jpg\";
回答4:
If anyone comes to this page looking to do this in a React-based client, you can do something like the below, which was an answer original provided by Sophia Alpert of the React team here
getInitialState: function(event) {
return {image: \"http://example.com/primary_image.jpg\"};
},
handleError: function(event) {
this.setState({image: \"http://example.com/failover_image.jpg\"});
},
render: function() {
return (
<img onError={this.handleError} src={src} />;
);
}
回答5:
If you create an image tag and add it to the DOM, either its onload or onerror event should fire. If onerror fires, the image doesn\'t exist on the server.
回答6:
You may call this JS function to check if file exists on the Server:
function doesFileExist(urlToFile)
{
var xhr = new XMLHttpRequest();
xhr.open(\'HEAD\', urlToFile, false);
xhr.send();
if (xhr.status == \"404\") {
console.log(\"File doesn\'t exist\");
return false;
} else {
console.log(\"File exists\");
return true;
}
}
回答7:
This works fine:
function checkImage(imageSrc) {
var img = new Image();
try {
img.src = imageSrc;
return true;
} catch(err) {
return false;
}
}
回答8:
You can do this with your axios by setting relative path to the corresponding images folder. I have done this for getting a json file. You can try the same method for an image file, you may refer these examples
If you have already set an axios instance with baseurl as a server in different domain, you will have to use the full path of the static file server where you deploy the web application.
axios.get(\'http://localhost:3000/assets/samplepic.png\').then((response) => {
console.log(response)
}).catch((error) => {
console.log(error)
})
If the image is found the response will be 200 and if not, it will be 404.
Also, if the image file is present in assets folder inside src, you can do a require, get the path and do the above call with that path.
var SampleImagePath = require(\'./assets/samplepic.png\');
axios.get(SampleImagePath).then(...)
回答9:
Basicaly a promisified version of @espascarello and @adeneo answers, with a fallback parameter:
const checkImage = (path, fallback) => {
return new Promise(resolve => {
const img = new Image();
img.src = path;
img.onload = () => resolve(path);
img.onerror = () => resolve(fallback);
});
};
// Usage:
const link = checkImage(
\'https://www.fillmurray.com/640/360\',
\'https://via.placeholder.com/150\'
).then(result => console.log(result) || result)
// It can be also implemented using the async / await API.
Note: I may personally like the fetch
solution more, but it has a drawback – if your server is configured in a specific way, they will return 200 / 304, even if your file doesn\'t exist. This, on the other hand, will do the job.