Javascript 获取浏览器是否忙

Javascript 获取浏览器是否忙,javascript,firefox,firefox-addon,greasemonkey,Javascript,Firefox,Firefox Addon,Greasemonkey,我正试图找到一种方法,从JavaScript获取浏览器当前是否繁忙。我正在考虑做一个Firefox扩展,如果当前页面正在加载某个内容(通过ajax或普通页面加载),或者使用Greasemonkey脚本,或者通过一些JavaScript API(这将是最好的解决方案,但从我所看到的情况来看,这种类型的内容根本不存在),就可以注入布尔值或其他内容 我想知道最好的方法是什么。我一直在寻找Firefox插件/Greasemonkey教程来制作类似的东西,但找不到任何东西。有没有人能给我提供一些建议或资源

我正试图找到一种方法,从JavaScript获取浏览器当前是否繁忙。我正在考虑做一个Firefox扩展,如果当前页面正在加载某个内容(通过ajax或普通页面加载),或者使用Greasemonkey脚本,或者通过一些JavaScript API(这将是最好的解决方案,但从我所看到的情况来看,这种类型的内容根本不存在),就可以注入布尔值或其他内容

我想知道最好的方法是什么。我一直在寻找Firefox插件/Greasemonkey教程来制作类似的东西,但找不到任何东西。有没有人能给我提供一些建议或资源,或者更好的解决方案

谢谢

编辑:在忙的时候,我主要需要知道浏览器是否正在从服务器发送或接收数据。

,一个伟大的用于DOM操作和执行ajax调用的javascript框架,提供了两个伟大的钩子来确定ajax调用何时进行:

这两个钩子都采用了一个处理函数,分别在ajax调用即将开始和所有ajax调用停止时调用该函数。这些函数可以绑定到页面上的任何元素。您可以在
$.ajaxStart()
处理程序中将全局布尔值设置为true,并在
$.ajaxStop()处理程序中将其设置为false

然后可以检查该布尔标志并确定ajax调用是否正在进行

大致如下:

$(document).ajaxStart(function() {
    window.ajaxBusy = true;
});

$(document).ajaxStop(function() {
    window.ajaxBusy = false;
});
至于确定浏览器何时加载当前页面,您可以检查
document.readyState
。加载文档时,它返回一个字符串
“加载”
,加载后返回一个字符串
“完成”
。您可以将处理程序绑定到
document.onreadystatechange
,并设置一个全局布尔值,以指示文档是否仍在加载

大概是这样的:

document.onreadystatechange = function() {
    switch (document.readyState) {
        case "loading":
            window.documentLoading = true;
            break;
        case "complete":
            window.documentLoading = false;
            break;
        default:
            window.documentLoading = false;
    }
}   
var ajaxInterval = setInterval(function() {
    if (orequests.length > 0) {
      // ajax calls are in progress
      window.xttpBusy = true;
    } else {
      // ajax calls have ceased
      window.xttpBusy = false;
      // you could call clearInterval(ajaxInterval) here but I don't know if that's your intention
    },
    3000 // run every 3 seconds. (You can decide how often you want to run it)
}); 
function busy() {setTimeout(busy, 0);do_something();}
busy();
编辑:

似乎
$.ajaxStart()
$.ajaxStop()
不适用于未使用jQuery调用的ajax调用。所有XMLhttprequest对象都有一个名为
readystatechange
的事件,您可以将处理程序附加到该事件。您可以利用此功能来确定是否完成了单个调用。您可以将对未完成调用的所有引用推送到数组中,并在
setInterval()
中检查该数组的长度。如果它>1,则会有大量ajax调用。这是一个粗略的方法,而且只有一种方法。可能还有其他方法可以做到这一点。但一般的做法是:

// declare array to hold references to outstanding requets
window.orequets = [];

var req = XMLHttpRequest(); 
// open the request and send it here....
// then attach a handler to `onreadystatechange`
req.onreadystatechange = function() {
    if (req.readyState != 4 || req.readyState != 3) {
        // req is still in progress
        orequests.push(req);
        window.reqPos = orequests.length -1
    } else {
        window.orequests = orequests.slice(reqPos, reqPos + 1);
    }
}
对要发送的每个
XMLHttpRequest()
执行上述操作,当然要更改每个请求的名称。然后运行一个每隔x毫秒运行一次的
setInterval()
,并检查
orequests
的length属性。如果它等于零,则不发生任何请求;如果它大于零,则请求仍在发生。如果没有发生任何请求,您可以通过
clearInterval()
清除间隔或使其保持运行

您的设置间隔可能如下所示:

document.onreadystatechange = function() {
    switch (document.readyState) {
        case "loading":
            window.documentLoading = true;
            break;
        case "complete":
            window.documentLoading = false;
            break;
        default:
            window.documentLoading = false;
    }
}   
var ajaxInterval = setInterval(function() {
    if (orequests.length > 0) {
      // ajax calls are in progress
      window.xttpBusy = true;
    } else {
      // ajax calls have ceased
      window.xttpBusy = false;
      // you could call clearInterval(ajaxInterval) here but I don't know if that's your intention
    },
    3000 // run every 3 seconds. (You can decide how often you want to run it)
}); 
function busy() {setTimeout(busy, 0);do_something();}
busy();

从技术上讲,浏览器从不“忙”。商业是一个非常主观的术语。让我们假设主线程正在执行一个简单的
,而
循环会阻止执行。这可能会被认为很忙,但如果你有这样的事情怎么办:

document.onreadystatechange = function() {
    switch (document.readyState) {
        case "loading":
            window.documentLoading = true;
            break;
        case "complete":
            window.documentLoading = false;
            break;
        default:
            window.documentLoading = false;
    }
}   
var ajaxInterval = setInterval(function() {
    if (orequests.length > 0) {
      // ajax calls are in progress
      window.xttpBusy = true;
    } else {
      // ajax calls have ceased
      window.xttpBusy = false;
      // you could call clearInterval(ajaxInterval) here but I don't know if that's your intention
    },
    3000 // run every 3 seconds. (You can decide how often you want to run it)
}); 
function busy() {setTimeout(busy, 0);do_something();}
busy();
浏览器本身没有被阻止,因此页面是否“忙”还不清楚。而且,这甚至还没有涉及到网络工作者和chrome中的代码


你将很难做到这一点,即使你做到了,也很可能无法达到你的预期效果。尽管如此,祝你好运。

以下是我认为我最终会做的事情。此解决方案与Alex建议的Jquery事件解决方案类似,只是它适用于使用XMLHttpRequest(包括Jquery)的任何内容:


我的意思是网络很忙。我需要知道浏览器是否正在发送或录制数据。我会更新我的帖子来澄清。谢谢。OP问如何从Firefox扩展而不是使用jQuery的网页上实现这一点。我仔细阅读了关于这两种方法的jQuery文档,他们发现了我想要的东西。但我仍然有一个问题:这些事件是否只绑定到jQueryAjax调用?或者任何JavaScript Ajax调用?@idealmachine,我真的要求任何解决方案,包括firefox或JavaScript库。@idealmachine您可以在firefox扩展中使用jQuery。有许多方法包含它。我经常选择这一条:@Alex,非常感谢你。我要玩玩这个。我想这正是我所需要的。我想我会评论说,3年后,我们仍然在使用这种基本方法,而且效果很好!这真是太棒了!谢谢对于一些网站的自动测试/抓取非常有用。