当重点放在其他窗口时,有没有办法停止运行Javascript Web应用程序? 例如,如果我在应用程序Web中执行AJAX,那么在这种情况下停止运行会非常有效。
答案 0 :(得分:3)
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
}
});
});