У меня есть IP-камера, которая транслирует видео в реальном времени на мой веб-сайт. Проблема в том, что он питается от элемента управления ActiveX. Еще хуже, этот элемент управления не подписан. Чтобы предоставить более безопасную альтернативу людям, использующим браузеры, отличные от IE, или (по праву) не желающие изменять свои настройки безопасности, я подключаюсь к встроенным в снимок сценариям моментальных снимков камер, которые подают живое изображение JPEG размером 640x480. План состоял в том, чтобы обновлять изображение в реальном времени на экране каждые ~ 500 мсек, используя Javascript, без необходимости перезагружать всю страницу.
Я пытался использовать объект Image () для предварительной загрузки изображения и обновления атрибута SRC элемента изображения при запуске onload:
function updateCam() {
var url = "../snapshot.cgi?t=" + new Date().getTime();
img = new Image();
img.onload = function() {
$("#livePhoto").attr("src", url);
camTimer = setTimeout(updateCam, 500);
}
img.src = url;
}
Это работало прилично, но было трудно определить, когда камера была отключена, что мне нужно было сделать, чтобы изящно ухудшиться. Внутренний сценарий моментального снимка настроен так, чтобы возвращать код состояния HTTP 204 (без содержимого) при таких обстоятельствах, и, конечно, у меня нет способа обнаружить это с помощью объекта Image. Кроме того, событие загрузки не было надежным на 100%.
Поэтому я использую функцию jQuery (версия 1.2.6) ajax
для выполнения запроса GET по URL-адресу, а при обратном вызове complete
я оцениваю код состояния и задаю соответствующий URL-адрес:
function updateCam() {
var url = "../snapshot.cgi?t=" + new Date().getTime();
$.ajax({
type: "GET",
url: url,
timeout: 2000,
complete: function(xhr) {
try {
var src = (xhr.status == 200) ? url : '../i/cam-oos.jpg';
$("#livePhoto").attr("src", src);
}
catch(e) {
JoshError.log(e);
}
camTimer = setTimeout(updateCam, 500);
}
});
}
И это прекрасно работает. Но только в IE! На этот вопрос я бы хотел ответить: почему это не работает в Firefox или Chrome? Событие complete
даже не запускается в Firefox. В Chrome он срабатывает, но только очень редко настройка SRC фактически загружает запрошенное изображение (обычно ничего не отображается).