2012 年 1 月 16 日,星期一

使用 localStorage 儲存狀態

更新:DataTables 1.10 預設使用 localStorage 來儲存狀態。此文章保留作為參考;請參考手冊以取得關於如何使用 DataTables 的最新說明。

撰寫軟體函式庫最大的挑戰之一,在於維護其 API 並確保升級到較新版本的函式庫盡可能地無痛。DataTables API 經歷了時間的考驗,但有時先前實作的某些功能在未來版本中可能不再理想。在此情況下,DataTables 1.9(beta 2)在狀態儲存方式上進行了重大變更,並且移除了兩個舊的初始化選項,取而代之的是更具彈性的選項。

在這篇文章中,我將解釋變更的內容、DataTables 1.9 的新功能,並展示如何利用這些改進,使用 localStorage 而非 Cookie 或任何其他您想使用的狀態儲存方式,來輕鬆實作表格的狀態儲存。

狀態儲存

DataTables 中的狀態儲存是透過將 JSON 字串儲存到 Cookie 中來完成的,使其盡可能保持瀏覽器相容性,同時將狀態儲存保留在用戶端。有時,能夠修改表格儲存的參數(新增您自己的參數或修改核心參數)會很有用,而 DataTables 1.8 透過兩個初始化選項提供了此功能

然而,實際使用這些選項遠非直觀,現在它們已被五個新的初始化選項取代,這些選項清楚地分離了實際儲存和載入資料的動作(fnStateSavefnStateLoad)、定義和修改要儲存和載入的參數(fnStateSaveParamsfnStateLoadParams),以及在狀態載入時發出的通知(fnStateLoaded)。

傳遞給每個函式的參數在上面連結的文件中都有完整定義。這些新函式的一個主要優點是,它們會為您提供一個可操作的 JavaScript 物件,而不是像以前那樣必須處理的字串,這讓生活變得更加輕鬆!fnStateSavefnStateLoad 的預設行為仍然是使用內部的 Cookie 儲存程式碼,但如下所示,這可以很容易地更改為以您想要的任何方式儲存狀態。

不要變更 API!

在至少提前一個主要版本不建議使用變更的 API 的情況下移除 API 是例外情況,並且不是 DataTables 專案普遍會採用的模式,但在這種情況下,狀態儲存 API 非常難以使用,並且由於這個事實而很少使用。因此,我認為採取這個步驟是正確的 - 如果有人目前正在使用 fnStateLoadCallbackfnStateSaveCallback 初始化選項,並且希望更新到 1.9,請在論壇中貼出您目前的程式碼,我將提供免費支援來更新新方法的程式碼。

localStorage

Cookie 有許多缺點,例如需要增加 HTTP 頻寬和 4K 限制。W3C Web 儲存規範定義了 localStorage 作為一種本機儲存方法,我們可以在 DataTables 中使用它來儲存狀態,而不會有使用 Cookie 的固有問題。

為了使用 localStorage 儲存狀態,我們必須首先使用 bStateSave 初始化選項啟用狀態儲存,然後定義我們的 fnStateSavefnStateLoad 函式。fnStateSave 將接收兩個參數,第一個是 DataTables 設定物件,第二個是我們想要儲存的狀態物件。為了儲存狀態,我們只需使用 localStorage.setItemJSON.stringify (請注意,因此,這將不適用於不支援 localStorage 或具有內建 JSON 解析能力的瀏覽器)。然後,我們可以將 fnStateLoad 定義為一個函式,它將簡單地讀取我們儲存的物件,解析 JSON 並將其返回

$(document).ready(function() {
    $('#example').dataTable( {
        "bStateSave": true,
        "fnStateSave": function (oSettings, oData) {
            localStorage.setItem( 'DataTables', JSON.stringify(oData) );
        },
        "fnStateLoad": function (oSettings) {
            return JSON.parse( localStorage.getItem('DataTables') );
        }
    } );
} );

就是這樣!在沒有 Cookie 的缺點的情況下,使用 localStorage 儲存 DataTables 的設定。一個簡單且有用的修改是考慮到目前的網頁 URL,以防您在網域中使用多個 DataTables,因為 localStorage 是網域範圍的。我們可以透過 window.location.pathname 來實現這一點

$(document).ready(function() {
    $('#example').dataTable( {
        "bStateSave": true,
        "fnStateSave": function (oSettings, oData) {
            localStorage.setItem( 'DataTables_'+window.location.pathname, JSON.stringify(oData) );
        },
        "fnStateLoad": function (oSettings) {
            return JSON.parse( localStorage.getItem('DataTables_'+window.location.pathname) );
        }
    } );
} );

使用這種方法,很容易看出您可以如何擴展它,以使用 Ajax 將狀態儲存在伺服器上的資料庫中(如果您這樣做,請注意 fnStateLoad Ajax 呼叫必須是同步的,因為沒有為非同步請求提供回呼)。

結論

<

p>總體而言,我希望您會同意這是一個對舊的、晦澀難懂的狀態儲存 API 非常受歡迎的更新,我期待看到如何使用新的 API,並希望您喜歡整體使用 DataTables 1.9。

如果您希望新增任何內容或有任何疑問,論壇中有一個關於這篇文章的評論和討論主題