Ich habe eine IP-Kamera, die Live-Video auf eine meiner Websites streamen. Problem ist, dass es von einem ActiveX-Steuerelement angetrieben wird. Schlimmer noch, dieses Steuerelement ist nicht signiert. Um eine sicherere Alternative zu den Leuten zu bieten, die andere Browser als IE benutzen oder (rechtmäßig) ihre Sicherheitseinstellungen nicht ändern wollen, klicke ich auf die Kameras, die im Snap-Shot-Skript erstellt wurden und 640x480 JPEG Live-Bilder liefern. Der Plan war, das Bild alle ~ 500ms live auf dem Bildschirm mit Javascript zu aktualisieren, ohne die gesamte Seite neu laden zu müssen.Dynamisch Vorladen/Anzeigen von Webcam-Schnappschüssen auf einer Webseite mit AJAX
Ich versuchte, das Bild() Objekt mit dem Bild vorab laden und das SRC-Attribut des Bildelementes zu aktualisieren, wenn sie abgefeuert 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;
}
Diese anständig gearbeitet, aber es war schwierig, wenn die bestimmen Die Kamera war deaktiviert worden, was ich tun musste, um mich elegant zu verschlechtern. Das interne Snapshot-Skript wurde so eingerichtet, dass es unter diesen Umständen einen HTTP-Statuscode von 204 (Kein Inhalt) zurückgibt, und natürlich kann ich das Image-Objekt nicht erkennen. Darüber hinaus war das Onload-Ereignis nicht 100% zuverlässig.
Daher verwende ich die jQuery (Version 1.2.6) ajax
Funktion eine GET-Anforderung auf der URL zu tun, und auf dem complete
Rückruf ich den Statuscode auswerten und die URL entsprechend eingestellt:
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);
}
});
}
Und das funktioniert wunderbar. Aber nur in IE! Das ist die Frage, die ich gerne beantwortet hätte: Warum funktioniert das nicht in Firefox oder Chrome? Das Ereignis complete
wird nicht einmal in Firefox ausgelöst. Es wird in Chrome ausgelöst, aber nur sehr selten lädt das SRC das angeforderte Bild (normalerweise zeigt es nichts an).
Wird der Callback überhaupt nicht aufgerufen? Oder funktioniert es einfach nicht? –
Überprüfen Sie den letzten Absatz der Frage. –