2014-12-03 105 views
0

使用jQuery和AJAX,我創建了一個循環每秒刷新控制檯的腳本。停止循環AJAX查詢

的頁面設置,像這樣: index.php -> console.php -> consoleQuery.php

哪裏index.php是主頁,與可以觸發多個AJAX腳本,並返回的內容替換的index.php身上的按鈕。其中一個腳本是console.phpconsole.php的一部分包括以下腳本。

window.setInterval(function() { 
    $.ajax({ 
     type: "POST", 
     url: "ajax/consoleQuery.php", 
     data: "", 
     success: function(response) { 
      $("#consoleBody").html(response); 
     } 
    }); 
    console.log("Console refreshed"); 
}, 1000); 

這個腳本在consoleQuery.php調用基本上更新頁面的身體,並刷新它的每一秒。

的problme然而,在點擊父級index.php
(例如index.php -> home.php)另一頁這就是 導致該環路中的JS仍然出現在背景中時home.php取代的index.php身體。最重要的是,觸發console.php再次導致它再次刷新控制檯每秒兩次,等等,如果它多次點擊。本質上,循環運行在多個實例中。

我想要嘗試的是觸發其中一個不請求console.php的AJAX請求,停止刷新頁面主體的循環腳本。

有什麼辦法可以在訪問不同的頁面時停止循環?提前致謝!

回答

2

如果你搶計時器ID:

var consoleRefreshTimer = window.setInterval... 

那麼你就可以阻止它:

clearInterval(consoleRefreshTimer); 

你可能想在每個子頁AJAX請求將其清除,一旦你渲染啓動需要它的子頁面。更好的情況是,請在子頁面中定義setupteardown函數,在您顯示它之後調用setup,在您開始新的AJAX請求之前調用teardown。或者爲每個頁面創建一個對象,以便將此功能包裝在主頁面中。快速和骯髒的例子:

var subpages = { 
    main: { 
    url: "http://example.com/main", 
    }, 
    console: { 
    url: "http://example.com/console", 
    setup: function() { 
     this.timer = setInterval(function() { console.log("consoled!"); }, 1000); 
    }, 
    teardown: function() { 
     clearInterval(this.timer); 
    } 
    } 
}; 

var getSubpage = (function() { 
    var currentSubpage = {}; 
    return function(key) { 
    var subpage = subpages[key]; 
    if (currentSubpage.teardown) currentSubpage.teardown(); 
    console.log("loading " + key + " (actually faking it with timers)"); 
    setTimeout(function() { 
     currentSubpage = subpage; 
     console.log("showing " + key); 
     if (currentSubpage.setup) currentSubpage.setup(); 
    }, 500); 
    }; 
})(); 

getSubpage('main'); // main is loaded 
getSubpage('console'); // console is loaded; console timer starts up 
getSubpage('main'); // main is loaded; console timer stops 
+0

正是我需要的! setup和teardown方法不起作用,因爲在console.php AJAX腳本中調用了'setInterval'函數。然而,使用創建變量和清除間隔的方法完美工作!非常感謝您的幫助! – SteppingHat 2014-12-03 14:59:07