#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 означает, что основной сайт есть.
Комментарии:
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'});