2011-10-15 38 views
2

美好的一天人們,我正在一個項目中,我使用jQuery將頁面加載到div中,並且每個頁面都有它自己的jQuery腳本,我的問題是以前加載的腳本不能從DOM清除這給我的項目帶來了更大的問題。jQuery清除DOM以前加載腳本

例如,我有一組定時器在一個頁面中自動保存數據,但當我改變頁面時,定時器仍在運行並搞亂了內容。

我管理不斷變化的頁面是這樣的:

$(document).ready(function() { 

    $('li').click(function (event) { 

     $('.progressbarone').hide(); 
     var theitem = this.id; 
     //isf ajax to load with addon 
     var thefile = "isf_ajax.php?addon="+this.id; 
     var progress = '<span class="progressbarone"><img src="' 
     + THEMEURL 
     + '/gfx/images/progessbar1.gif" width="20" height="16" /></span>'; 

     // pre actions 
     $('.'+ theitem +'_item') 
     .append(progress) 
     .children(':last') 
     .hide() 
     .fadeIn(1000); 
     $('li').removeClass('active'); 
     $(this).addClass('active'); 

     // load the page 
     $('#childpage').remove(); 
     $('#officetable').html('<div id="childpage">loading</div>'); 
     $('#childpage').load(thefile, function() { 

     // after load actions 
     $('.progressbarone').fadeOut(2000); 
     }); 
    }); 
}); 

正如你可以看到我有兩個div,一個被稱爲處理該childpage和childpage有更改的頁面內容辦公檯。不過,正如你所看到的,我已經使用了remove();函數以及之後,我將childpage放置爲可執行文件併發布文件的內容,但仍不會刪除以前加載的腳本。

謝謝你們。

回答

3

將腳本附加到頁面後,就會運行這些腳本。儘管您從DOM中刪除腳本標記,但變量將保留。我的意思是計時器,函數,代碼中聲明的任何類型的變量。

因此,您可能想要清除之前不再需要的狀態。

function doTheCleanup(){ 
    clearTimeout(globalTimerVariable); 
    delete someGloablVar; 
    //and so on 
} 
+0

我要試試這個,謝謝我會讓你知道結果。 – user997057

+0

它修改了一點修改謝謝我也是新來的SOF是否有任何其他評級系統,所以我可以評價你的朋友。 – user997057

+0

@ user997057很高興幫助你!如果你有幾個定時器或變量,我建議保持它們的組織(即在一個對象等中)。 – Matias

1

如果您的腳本已經執行刪除DOM元素不會擺脫它們。使用JavaScript轉到任何頁面,打開firebug或控制檯並鍵入$(「script」)。remove()。一切都繼續運行。

這裏有一些提示:

  1. 不要再包括與每一個AJAX調用你的腳本。
  2. 如果 有需要處理的使用jQuery.live事件()
  3. 只有設置任何 定時器一次,而不是在每一個AJAX調用。

這聽起來像你正在構建一個單頁web應用程序,你可能想看看使用像backbone.js東西來組織你的代碼,並幫助你遵循一些更好的模式。看看這個教程:

http://addyosmani.com/blog/building-spas-jquerys-best-friends/

祝您好運

+0

多數民衆贊成正確的我建立一個SPWP到目前爲止我沒有任何抱怨,除了這個計時器thingy。我正在使用jquery live for modules,並且不會在每個jquery調用中重新包含腳本。我太過完成這個項目,所以我不能回到第0步,開始使用backbone.js,雖然它是一個很好的東西,我希望在開始這個項目之前看到它。 – user997057

+0

對不起,我誤解了這個問題!你在哪裏做你的計時器?正如另一張海報所說,你可以像這樣保存setInterval的結果。 var timer = setInterval(myFunction(){});並假設該變量在範圍內,您可以稍後調用clearInterval(timer)。祝你好運! –

+0

是的,我打算這樣做,就像他建議我是新來的jquery和整個JavaScript我實際上是一個php-mysql的專家,但我正在開發的SPWP變成真正的真棒我可能會發送給你一個演示鏈接,當它完成。 – user997057

0

的或許,如果你刪除的進度條跨度?此外,您可能會考慮使用$ .deferred - > .done

+0

這不會停止以前加載的腳本,我已經嘗試過了,我想它只用於回調其他函數或函數集實際上成功執行一個操作後 – user997057