当焦点在其他窗口时,有什么方法可以停止运行 Javascript Web 应用程序?例如,如果我在应用程序 Web 中执行 AJAX,在这种情况下停止运行会非常有效。
问问题
900 次
4 回答
3
Page Visibility API 执行一个简单但重要的功能——它让您的应用程序知道页面何时对用户可见。这条基本信息允许创建在不被查看时行为不同的网页。
Visibility.js - 页面可见性 API 的包装器
于 2013-01-10T13:06:41.643 回答
2
你的问题太理论化了。JS 中没有本地方法来跟踪窗口焦点,但实现自己的方法相对简单。
一旦您知道窗口是否在给定时间点具有焦点,您就可以在您的实现中使用此信息连续触发 AJAX 请求(很可能在某种循环中)并在窗口未获得焦点时跳过请求的触发。
例如
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);
于 2013-01-10T13:12:47.093 回答
1
页面可见性 api 的问题在于,它不兼容跨浏览器。没有 Safari,没有 IE<10。 https://developer.mozilla.org/en-US/docs/DOM/Using_the_Page_Visibility_API
您可以尝试使用窗口焦点和模糊事件。(jQuery 示例)
(function() {
var isFocused = true;
$(window).focus(function() {
isFocused = true;
});
$(window).blur(function() {
isFocused = false;
});
function doSomeAjax() {
if (isFocused) {
doSomething();
}
}
});
它不像页面可见性 api 那样花哨,因为它只告诉您选项卡是否聚焦,但它可能足以实现您想要做的事情。
于 2013-01-10T13:13:16.700 回答
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
}
});
});
于 2013-01-10T13:21:29.717 回答