Проверьте, доступен ли URL-адрес из веб-браузера, т.е. убедитесь, что он не заблокирован прокси-сервером

#javascript #html #scripting #proxy

#javascript #HTML #создание сценариев #прокси

Вопрос:

Я обслуживаю свой веб-сайт с mywebsite.com. Я размещаю изображения на flickr, поэтому все изображения загружаются в браузер пользователя через запросы get на flickr. Многие пользователи моих веб-сайтов получают доступ mywebsite.com из корпоративных сетей, которые блокируют доступ к flickr.com. Это означает, что пользователи получают очень раздражающие пустые заполнители вместо изображений. У меня такая же проблема с кнопкой Facebook like. Это делает мой сайт очень непривлекательным для таких пользователей.

Есть ли способ, которым я могу запустить скрипт на стороне клиента, который проверит, является ли flickr.com , facebook.com И т.д. Доступны. Если нет, я мог бы изменить атрибут href изображения для загрузки из альтернативного источника или заменить стандартным изображением, объясняющим, что их сеть блокирует доступ. Я также мог бы удалить кнопку Facebook like.

Я думал, что HTTP-запрос XML сделает свое дело, но тогда, я думаю, я столкнусь с междоменными проблемами. Думаю, я мог бы также настроить прокси-сервер для обслуживания изображений, но я не хочу этого делать; идея этого в том, что flickr сокращает пропускную способность.

TLDR: как мне определить, является ли flickr.com доступен из браузера пользователя, используя технологию на стороне клиента.

Ответ №1:

Вы могли бы попробовать это…

 var image = new Image();

image.onerror = function() {

   var images = document
                 .getElementById('flicker-images')
                 .getElementsByTagName('img');

   for (var i = 0, imagesLength = images.length; i < imagesLength; i  ) {
        images[i].src = 'images/flickr_is_blocked.gif';
   }

};

image.src = 'http://flickr.com/favicon.ico';
  

Халтурно, но, похоже, работает. Однако он полагается на то, что favicon.ico 404ing означает, что основной сайт есть.

jsFiddle.

Комментарии:

1. Это выглядит хорошим решением — я не думал об этом. Таким образом, обработчик onerror может заменить все атрибуты href моих изображений на «flickr_is_blocked.gif «. Попробую сделать это сегодня вечером и оставлю отзыв. Спасибо.

2. @planetjones Да, на самом деле, я отредактирую его, чтобы он делал именно это, предполагая, что вы имеете в виду src атрибут 🙂

3. да, это тот самый! хотя я мог бы также удалить href из прилагаемого якоря (или вообще удалить якорь!), поскольку нажатие на него не приведет пользователя далеко! еще раз спасибо — я думаю, это отлично справится с задачей

4. Здесь наблюдается интересное явление. В Internet Explorer (по крайней мере, версии 8), если вы используете image.src = ‘ flickr.com/favicon.ico ‘; затем он вызовет обработчик onerror, даже если значок доступен. Может показаться, что IE выдает ошибку при извлечении файлов .ico в изображение. Поэтому мой совет — всегда проверять подлинный формат изображения, т. Е. я просто указываю на свой файл .jpg на flickr

5. Спасибо за это. Подтверждено, что приведенный выше jsFiddle работает в последних версиях FF (10), Chrome (17) и IE (9).

Ответ №2:

Рабочий пример: http://jsfiddle.net/peeter/pW5wB /

JS:

 $(document).ready(function() {

    var callbackOnSuccess = function(src) {
        alert("Successfully loaded "   src);
        return false;
    };
    var callbackOnFailure = function(src) {

        alert("Failed loading "   src);

        // Here you can do whatever you want with your flickr images. Lets change the src and alt tags
        $(".flickr").attr("src", "flickr_is_blocked.gif");
        $(".flickr").attr("alt", "Flicker is blocked");
        // Lets change the parents href to #
        $(".flickr").parent().removeAttr("href");
        return false;
    };

    checkAvailability("http://flickr.com/favicon.ico", callbackOnSuccess, callbackOnFailure);


});

function checkAvailability(src, callbackSuccess, callbackFailure) {
    $("<img/>").attr("src", src).load(function() {
        callbackSuccess(src);
    }).error(function() {
        callbackFailure(src);
    });
}
  

HTML:

 <a href="http://flickr.com/favicon.ico">
    <img class="flickr" src="http://flickr.com/favicon.ico" alt="Flickr"/>
</a>
  

Комментарии:

1. Спасибо Peeter — я думаю, это хороший способ сделать это на jQuery. То, что я не рассматривал, — это обработчик ошибок при загрузке изображения.

2. Вы могли бы просто поместить обратный вызов следующим образом load(callback) .

3. Вы правы, Алекс, готово 🙂 @planetjones: Я обновил ответ, теперь он должен быть понятнее.

4. @Peeter Извините, я снова:P. Вам лучше использовать, removeAttr('href') чтобы сделать a элементы неактивными.

5. Использовал removeAttr (я всегда думал, что href был обязательным атрибутом, но поиск в Google доказал, что я ошибался), но добавил обратные вызовы переноса в функции anon. По какой-то причине предложенная вами версия вызвала оба обратных вызова.

Ответ №3:

Для facebook вы можете просто включить Facebook JS API, а затем проверить, существует ли один из объектов / функций, которые он экспортирует.

Было бы лучше, если бы вы (ab-) не использовали внешние хостинги для своих материалов. Если вам нужен CDN, лучше используйте реальный…

Комментарии:

1. спасибо — я не думаю, что злоупотребляю внешними хостингами … в рекомендациях сообщества flickr говорится, что они будут рады показать ваши фотографии на вашем веб-сайте, при условии, что вы свяжете изображение обратно. Это то, что я делаю — это фотографии, а не шаблонная графика и т.д., Которые, как я согласен, являются моей проблемой для обслуживания.

Ответ №4:

У Flickr и Facebook есть API, которые поддерживают JSONP, поэтому междоменность не является проблемой. т. Е. Вот запрос, который просто повторяет некоторые фиктивные данные из API flickr.

 $.ajax({
  url: "http://www.flickr.com/services/rest/?jsoncallback=?",
  dataType: 'json',
  data: {method: "fickr.test.echo", format: "json", api_key: "02de950d65ec54a7a057af0e992de790"},
  success: callback
});
  

Вы не можете надежно установить обработчики ошибок в запросе jsonp, поэтому показывайте «загружающееся» изображение до тех пор, пока не будет вызван этот успешный обратный вызов. Установите некоторый тайм-аут, по которому будет отображаться сообщение об ошибке, если ответ придет недостаточно быстро.

Ответ №5:

Это работает, но время ожидания должно быть установлено!

 $.ajax({
    url: "http://example.com/ping.html",
    type: 'GET',
    dataType: 'jsonp',
    jsonpCallback: 'jsonCallback',
    timeout: 1000,
    cache: false,
    success: function(response) {
        console.log("SERVER UP!");
    },
    error: function(e) {
        console.log("SERVER DOWN!");
    }
});
  

ping.html должен вернуться:

 jsonCallback({response:'PONG'});