当焦点在其他窗口时停止运行Javascript Web应用程序的方法

时间:2013-01-10 13:04:00

标签: javascript jquery

当重点放在其他窗口时,有没有办法停止运行Javascript Web应用程序? 例如,如果我在应用程序Web中执行AJAX,那么在这种情况下停止运行会非常有效。

4 个答案:

答案 0 :(得分:3)

Using the Page Visibility API

  

Page Visibility API执行一个简单但重要的功能 - 它   让您的应用程序知道用户何时可以看到页面。这个   基本信息使得能够创建网页   当他们没有被观看时表现不同。

Visibility.js - Page Visibility API的包装器

答案 1 :(得分:2)

你的问题太理论化了。 JS中没有用于跟踪窗口焦点的原生方式,但实现自己的方法相对简单。

一旦您知道窗口是否在给定时间点具有焦点,您就可以在实现中使用此信息,该信息会持续触发AJAX请求(最有可能出现在某种循环中)并在窗口为时跳过请求的触发没有集中注意力。

E.g。

var winFocused = false;

window.onfocus = function() {
  winFocused = true;
}
window.onblur = function() {
  winFocused = false;
}

然后在你的“循环”或其他什么,例如:

setInterval(function() {
  if( ! winFocused) return;

  // Otherwise, if winFocused is true, do what you need...

}, 1000);

答案 2 :(得分:1)

页面可见性api的问题是,它不是跨浏览器兼容的。没有Safari,没有IE< 10。 https://developer.mozilla.org/en-US/docs/DOM/Using_the_Page_Visibility_API

您可以尝试使用Windows焦点和模糊事件。 (jQuery示例)

(function() {
    var isFocused = true;
    $(window).focus(function() {
        isFocused = true;
    });

    $(window).blur(function() {
        isFocused = false;
    });

    function doSomeAjax() {
        if (isFocused) {
            doSomething();
        }
    }

});

它不像页面可见性api那样花哨,因为它只告诉你,标签是否有焦点,但它可能足以实现,你正在尝试做什么。

答案 3 :(得分:0)

您可以使用beforeSend设置将jqXHR对象存储在数组中,然后在window.blur上循环遍历数组并中止每个请求。简化示例如下:

$(document).ready(function () {
    var ajaxRequests = [];
    $.ajax({
        "beforeSend": function (jqXHR, settings) {
            ajaxRequests.push(jqXHR);
        },
        //... other settings
    });
    $.ajax({
        "beforeSend": function (jqXHR, settings) {
            ajaxRequests.push(jqXHR);
        },
        //... other settings
    });
    $.ajax({
        "beforeSend": function (jqXHR, settings) {
            ajaxRequests.push(jqXHR);
        },
        //... other settings
    });
    $(window).blur(function () {
        var xhr = null,
            i = 0;
        for (i = ajaxRequests.length - 1; i = 0; i -= 1) {
            xhr = ajaxRequests.pop(); //remove last jqXHR from array and return it
            xhr.abort(); //abort it
        }
    });
});