2012-02-09 58 views
2

我正在通過ajax加載頁面。整個頁面包括<html> <head> <body>。 所以我需要調用所有應該在頁面加載時調用的腳本。但瀏覽器記得其中一些已經加載到這個窗口,他不會再執行它們。刪除/重新加載已加載的腳本

如何刪除所有加載的腳本?

或者更好,如何加載整個頁面,但有一些舊對象在前一頁的背景中工作?例如上傳和其他通信。

代碼: this.load =函數(ADR) {
this.iris();

$.ajax({ 
      type: 'GET', 
      url: adr, 
      dataType: 'html', 
      success: function(data) 
      {  
      $("body").html(html); 
      } 
    }); 

編輯: 對不起球員,我已經寫了它可能是錯誤的,因爲你的答案是好的,但解決別的東西,wchich我可以自己解決。所以我會試着用不同的方式來講述它。

  • 我無法保存到初始化函數或別的

    爲什麼 - 因爲我有一些模板,有JS在插件工作(表單,卡倫德..)文件對於每個。 每個插件都在加載的腳本上立即通過匿名函數初始化它自己。

所以當我加載ajax的HTML它不會初始化這個新的HTML。 (例如不會找到並且不會添加監聽器)。

+1

感謝-rep,但要英雄,知道爲什麼:) – Jindra 2012-02-09 20:12:34

+0

我不明白你爲什麼downvoted他的問題,夥計們。我想這個問題非常清楚。 – 2012-02-09 20:21:03

+0

@JanKuča我沒有downvote,但我仍然認爲問題表明缺乏JavaScript的機制的理解。 – Christian 2012-02-09 20:34:28

回答

3

執行腳本時,無法取消執行腳本,即使替換整個DOM,它也會保留在範圍內。

因此,如果您創建對象window.a = new A();並用$('body').html(html);替換DOM,則該對象仍可作爲window.a訪問。

更新:

我想象你的腳本定義都包含在<head>,你有一個地方,你給他們打電話。

<!DOCTYPE html> 
<html> 
<head> 
    <script src="script1.js"></script> 
    <script src="script2.js"></script> 
</head> 
<body> 
    ... content ... 

    <script> 
window.onload = function() { 
    // initialization code here 
}; 
    </script> 
</body> 
</html> 

放入頭初始化<script>以及同時存儲在變量中function。然後,當您加載新內容時,請僅替換<body>的內容並調用該功能。

<!DOCTYPE html> 
<html> 
<head> 
    <script src="script1.js"></script> 
    <script src="script2.js"></script> 

    <script> 
var a = function() { 
    // initialization code here 
}; 

var load = function (adr) { 
    $.ajax({ 
    type: 'GET', 
    url: adr, 
    dataType: 'html', 
    success: function (data) { 
     data = data.exec(/<body[^>]*?>(.*)<\/body>/i); 
     $("body").html(data); 

     a(); // call the function after each load 
    } 
    }); 
}; 
    </script> 
</head> 
<body onload="a()"> 
    ... content ... 
</body> 
</html> 
+0

感謝您的回覆!但我不明白如何解決腳本的問題。例如,有至少15腳本女巫的手柄設計,菜單,輸入的日期。但他們在各自分隔的文件,他們正在通過匿名函數初始化,所以我不能給他們打電話,當頁面被阿賈克斯再次加載。 – Jindra 2012-02-09 20:39:19

+0

查看我的更新回答。 – 2012-02-09 20:52:40

+0

謝謝,但我不能將初始化保存到函數中。我已更新我的問題以獲得更好的理解, – Jindra 2012-02-09 21:13:50

1

「未執行」腳本的唯一方法是首先將它設計爲這樣。

這不是特別難,但它需要一些知識 - 沒有魔術開關來打開它。

例如...

指數。HTML

<script src="script1.js"></script> 
<script src="script2.js"></script> 
<script> alert(pie); </script> 

script1.js

var pie = 'Hello world!'; 

script2.js

var pie = 'Hello cruel world!'; 

因此,在短期,一個重要的先決條件是,你保持一個罪中的所有代碼gle入口點,您可以稍後輕鬆地覆蓋/刪除該入口點。

+0

我知道這一點,但我無法修改正在加載的腳本。他們是模板的一部分。但也許會工作加載腳本作爲文本,保存它們的功能,然後評估。它會起作用嗎?我沒有太多的JavaScript經驗。我只是看了一些書,但沒有像負載文本只是beggining的東西,用菜單嘛移動...... – Jindra 2012-02-09 21:04:16

+0

,你問什麼,在「卸載」的一部分,是很模糊的。在JavaScript中,您可以刪除和覆蓋功能,屬性和內容。您也可以'修復'受損的DOM(HTML部分)。所以你需要的不是真的脫離這個世界,但在這一點上它只是模糊不清。 – Christian 2012-02-10 19:33:24

0

而是直接把初始化代碼的腳本,以便它立即執行,把它放在一個函數,然後調用該函數需要的。

包括這一次,

function initialize() { 
    alert('(Re)initializing'); 
} 

然後,每當頁面被 「重載」,再打電話initialize()

+0

感謝您的回覆,但這是我認爲我不能做的一個。 – Jindra 2012-02-09 21:04:56