簡體   English   中英

僅在查看頁面時運行Javascript Ajax調用

[英]Run Javascript Ajax calls only when the page is being viewed

我有一個在控制器上運行的Web應用程序(幾乎沒有限制的處理,內存和網絡帶寬)。 該頁面基本上是一個充滿LED的簡單HTML文件,應該按間隔更新。 在每個時間間隔,Javascript向服務器發送Ajax請求,並根據回復更新所有LED。 現在這個工作正常!

問題是當用戶打開其中一個頁面並開始瀏覽其他內容時。 出於安全性和經濟原因,我們不希望在客戶端未看到此頁面時更新頁面。 這是算法:

頁面更新算法的流程圖

我開發了這個小測試代碼,看看頁面事件是如何工作的( 參見jsFiddle上的直播 ):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function m(msg){
    document.getElementById("logplace").innerHTML+=msg+"<br/>";
}
</script>
</head>
<body onblur="m('Blur')" onerror="m('Error')" onfocus="m('Focus')" onload="m('Load')" onresize="m('Resize')" onunload="m('Unload')">
<span id="logplace"></span>
</body>
</html>

我需要頁面才能在用戶當前正在查看時才更新。 我搜索了Stackoverflow,以下線程似乎不是答案:

PS。 JQuery也存在於服務器上。 但如果有一種更簡單的方法,我寧願不使用JQuery。

var focused = false;

function onBlur() {
    focused = false;
};
function onFocus(){
    focused = true;
};

if (/*@cc_on!@*/false) { // check for Internet Explorer
document.onfocusin = onFocus;
document.onfocusout = onBlur;
} else {
window.onfocus = onFocus;
window.onblur = onBlur;
}

然后你的JavaScript可以檢查

if (focused)
{
    // process ajax
}

來源: http//www.thefutureoftheweb.com/blog/detect-browser-window-focus

查看他創建的演示,以便您可以看到它的實際效果: http//www.thefutureoftheweb.com/demo/2007-05-16-detect-browser-window-focus/

考慮到這一點,如果您的頁面使用間隔計時器進行更新,當窗口失去焦點時,您可以終止間隔,然后在窗口聚焦時再次啟動它。

據我所知,你的數據庫中有頁面列表。 您可以添加名為is_viewed的字段,並在每次用戶進入頁面時將其更新為+1,每次退出頁面時為-1。 因此,如果它是== 0,您可以執行檢查。
我沒有看到任何其他方式(不是Ajax)來檢查另一頁上的內容。 所以你無論如何都要發送請求

我建議當你啟動窗口時(你只想在可見時更新),你可以從主窗口或具有焦點的其他窗口啟動它。 結合Francis的焦點解決方案和以下技術,您可以從另一個方法訪問窗口的DOM。

您可以在此處查看更多信息。 基本上您將使用以下代碼

var pageControl=open('page.html','page name','width=200,height=200')

打開頁面,並能夠使用javascript通過pageControl變量訪問它。

它通過允許您在窗口具有焦點,從其他窗口或從主窗口控制更新時更新頁面來解決此問題。 這里唯一的潛在障礙是兼容性。

主窗口解決方案可能涉及更多一點。 但是如果你是從其他窗口做到這一點,你可以想象如果你發現沒有窗口有焦點,那么你就不會激活更新腳本了......否則就會解雇它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM