2013-09-16 2 views
75

Использование javascript - способ узнать, доступен ли ресурс на сервере? Например, у меня есть изображения 1.jpg - 5.jpg, загруженные на страницу html. Я бы хотел вызвать функцию JavaScript каждую минуту или около того, чтобы примерно сделать следующий код нуля ...Проверьте, существует ли изображение на сервере с помощью JavaScript?

if "../imgs/6.jpg" exists: 
    var nImg = document.createElement("img6"); 
    nImg.src = "../imgs/6.jpg"; 

Мысли? Благодаря!

ответ

123

Вы могли бы использовать что-то вроде:

function imageExists(image_url){ 

    var http = new XMLHttpRequest(); 

    http.open('HEAD', image_url, false); 
    http.send(); 

    return http.status != 404; 

} 

Очевидно, что вы могли бы использовать JQuery/аналогичный для выполнения вашего запроса HTTP.

$.get(image_url) 
    .done(function() { 
     // Do something now you know the image exists. 

    }).fail(function() { 
     // Image doesn't exist - do something else. 

    }) 
+0

Я использовал свой первый пример, и он отлично работает, спасибо так много @ajtrichards! – 0xhughes

+0

Кто-нибудь знает, как избежать сообщения об ошибке HEAD, которое появляется в консоли в любом браузере? Я хочу запустить этот скрипт, не будучи ошибкой, если изображение не существует. Спасибо – cwiggo

+0

@ Chris try {http.open ('HEAD', image_url, false); http.send();} catch {} – CoR

3

Если вы создаете тег изображения и добавляете его в DOM, его огонь или событие onerror должны срабатывать. Если запущен onerror, изображение не существует на сервере.

27

Вы можете просто проверить, загружено или нет изображение, используя встроенные события, которые предоставляются для всех изображений.

В onload и onerror событий покажет вам, если изображение успешно загружен, или если произошла ошибка:

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"; 
+2

Лучший ответ для меня, поскольку он работает в каждом случае (проблема связи, внешний сервер ...) +1 –

+1

Сравнивает производительность этого ответа с альтернативой AJAX.get. Этот ответ выполняется намного быстрее! – Samuel

+0

Мне нравится это решение, так или иначе оно вводит события в обоих случаях (асинхронное выполнение), что может вызвать проблемы в некоторых ситуациях: я бы предложил добавить изображение в любом случае, а затем заменить его только в случае ошибок. –

68

Вы можете использовать основной способ изображения Preloaders работу, чтобы проверить, если изображение существует.

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

+0

Эй, крутая функция! Как замечание, это интересный способ вернуть результаты, прямо в анонимную функцию. Обычно я делаю это с помощью выражения 'return', как @ajtrichards в первой части его ответа. – Sablefoste

+3

@Sablefoste, но синхронные запросы - плохая идея ... – epascarello

+0

Абсолютно; но я никогда не думал о том, чтобы другой способ был синхронным. Я исхожу из длинной истории процедурного кодирования и иногда пропускаю «другой» способ взглянуть на вещи ... Держу пари, что я не единственный. ;-) – Sablefoste

5

Если кто приходит на эту страницу ищет, чтобы сделать это в Реагировать -На клиент, вы можете сделать что-то вроде ниже, который был ответ оригинал при условии Бен Альперт из Реагировать команда 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} />; 
    ); 
} 
1

Вы можете назвать это JS функцию, чтобы проверить, если файл существует на сервере:

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; 
    } 
} 
1
$("img").on("load",function(){ 
    alert(" Image Exists...!"); 
}).on("error", function(){ 
    alert("ERROR"); 
}); 

Демо: @http://jsfiddle.net/Ns5mU/304/

+0

Это скажет вам, существует ли этот элемент, но он не говорит вам, является ли URL-адрес файла изображения действительным или нет. – John

+0

Я думаю, что это именно эквивалент jquery [adeneo] (https://stackoverflow.com/a/18837813/2342537). По крайней мере, в моем случае это делает то же самое. –

Смежные вопросы