2013-03-18 57 views
2

我開始使用脫機Web應用程序。我有一個小測試應用程序,當離線時,使用localstorage進行簡單的abm,我的想法是當它在線時,應用程序使用php作爲後端語言,並在連接返回時同步localstorage和php。刪除JS文件幷包含另一個

現在,用於將數據保存到localstorage的函數與用於將數據發送到php的函數不同。

是否有可能,dinamically,卸載一個JS文件(讓我們叫它offline.js)和加載另一個(online.js)?

或女巫會是一個更好的方法?我是否應該將所有功能都包含在一個文件中,並且可以隨意改變聽衆的位置?

+6

你不能卸載的JavaScript。保持你的函數在對象中,並交換周圍的對象。 – Dave 2013-03-18 02:31:01

回答

3

如果瀏覽器處於聯機狀態,您應該有Function Wrapper以啓動IF Condition檢查。

例如:

function SaveData(data){ 
    if(BrowserIsOnline) 
     SaveDataToPHPServer(data); 
    else 
     SaveDataToLocalStorage(data); 

和不同的方式處理每一個函數體。

1

在現代瀏覽器中,您可以使用navigator.onLine檢查連接。這裏是規格:http://www.w3.org/TR/offline-webapps/

var connection = navigator.onLine; 

if(connection){ 
    //Do AJAX 
}else{ 
    //Do Local Storage. 
} 
2

你不能卸載JavaScript文件。一旦它被加載,它將始終被加載。你可能不得不重新考慮一下你的設計。

0

這裏是一個可能的解決方案,它可能對你有用...

有所有你的邏輯駐留功能命名,如:

this.fn = {}; 
this.fn['save'] = function() {}; 
this.fn['load'] = function() {}; 

當你的事件被解僱,你只需使用適當的函數,如下所示:

var fn = this.fn['load']; 

var fn = this.fn['save']; 

然後像平常一樣使用'fn'。

你可以甚至模塊分開的功能,如「online.js」和「offline.js」,其中每個模塊將具有同樣的功能名稱,但綁定到它自己的命名空間。

在時機成熟時重新連接功能,您可以簡單地這樣做:

this.fn['load'] = offlineModule.fn['load']; 

如果您對您的所有功能的名稱(即:「負荷」,「保存」)你可以簡單地把它放在一個循環中。

以上避免了所有的「如果/其他」條件分支,可有時招人煩,相反的嘗試使用一種模式。

可是大問題,無論如何,因爲我開始了一個項目規劃階段,我需要類似於您在您的問題描述什麼東西......到目前爲止,這是我爲它的最佳解決方案。基本上受Linux中的SO(動態鏈接)動態鏈接的啓發。