我有一个本地应用程序,其中包含一个用于与Web应用程序交换JSON的Web服务器。 Web应用程序本身是从Web提供的,这意味着浏览器将它们视为跨域。
当应用程序运行时,它提供正确的跨源头以允许交换。但是,我想要的是快速检测应用程序是否正在运行的选项。
目前的方法是将AJAX用于localhost服务上的“心跳”URL:
pg.init.getHeartbeat = function(port) {
var url = pg.utils.baseUrl('heartbeat', port); // returns a localhost URL
$.ajax({
url: url,
type: 'GET',
async: true,
success: function(data) {
// Hooray! Application is there. Do 'hooray' stuff
},
error: function(data) {
// Whoah the bus. Application not there. Do 'no application' stuff.
}
});
};
在Webkit中运行良好。 Webkit试图获得心跳,快速失败,并且很快就会失败。
问题出在Firefox中。 Firefox试图获得心跳,并且需要4到10秒才能失败。它可能看起来不是很多,但是在UI移动之前4秒,用户进入下一步就是让应用程序感觉非常缓慢且无响应。
还有其他想法吗?据我所知,更改iFrame的src属性并捕获失败也不起作用。它不会触发错误事件。即使我可以从示例代码中触发错误,它仍然需要4秒,因此没有净改进。
Web服务器端的东西不应该有任何服务器端脚本语言(PHP等);我需要JavaScript能够独立处理它。
答案 0 :(得分:1)
如果导航器是Firefox,您可以暂停:
var timeoutcall = 0;
if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1)
{
timeoutcall = 100;
}
$.ajax({
url: url,
type: 'GET',
timeout: timeoutcall ,
async: true,
success: function(data) {
// Hooray! Application is there. Do 'hooray' stuff
},
error: function(data) {
// Whoah the bus. Application not there. Do 'no application' stuff.
}
});
如果超时为0,则没有超时。所以,如果我在Firefox中,我将超时设置为100毫秒,如果我不在Firefox中设置为无限制。