【发布时间】:2009-05-29 22:52:30
【问题描述】:
我有一台 IP 摄像机,可以将实时视频流式传输到我的网站。问题是,它是由 ActiveX 控件驱动的。更糟糕的是,这个控件是无符号的。为了向使用 IE 以外的浏览器或(理所当然地)不愿更改其安全设置的人们提供更安全的替代方案,我正在利用内置快照脚本的相机,该脚本提供 640x480 实时 JPEG 图像。计划是使用 Javascript 每约 500 毫秒更新一次屏幕上的实时图像,而无需重新加载整个页面。
我尝试使用 Image() 对象预加载图像并在 onload 触发时更新图像元素的 SRC 属性:
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;
}
这工作得很好,但很难确定相机何时被禁用,我需要这样做才能优雅地降级。在这种情况下,内部快照脚本设置为返回 204(无内容)的 HTTP 状态代码,当然我无法使用 Image 对象检测到这一点。此外,onload 事件并非 100% 可靠。
因此,我使用 jQuery(版本 1.2.6)ajax 函数对 URL 执行 GET 请求,并在 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 实际加载请求的图像(通常它不显示任何内容)。
【问题讨论】:
-
根本就没有调用回调吗?或者它只是不起作用?
-
检查问题的最后一段。
标签: javascript jquery ajax