jQuery Mobile 是用於建立行動 Web 應用的前端開發框架。
jQuery Mobile 可以應用在智慧型手機與平板電腦。
jQuery Mobile 使用 HTML5 & CSS3 最小的腳本來佈局網頁。
最近公司的web app項目,使得我有幸一直接觸和學習jQuery Mobile。這確實是一個很不錯的行動開發庫,有助於擅長web開發的工程師,快速入門並建立自己的行動應用程式。但在前兩天,我碰到了一個問題,使我查了很多資料都沒有找到很好的解決方案,最終只能逼著我讀jQuery Mobile的源碼,再寫了個擴展,才得以解決。下面請讓我訓娓道來。
問題描述
假設在專案中,有三個頁面,分別是main.html、test1.html、test2.html(後面分別簡稱main、test1、test2),其中main頁面是包含一個轉向到test1頁面的連結(即a標籤),test1中有一個屬性為data-rel=”back”的鏈接和一個轉向到test2的鏈接,test2只有一個屬性為data-rel=”back”的鏈接。 main轉向到test1後,點擊back連結返回main(相當於點擊瀏覽器的返回按鈕),無需重新發送get請求;但是當test1轉向到test2,在test2頁面點擊back連結想返回test1時,會重新發送一個get請求。這樣導致的問題就是:test1所做的所有操作,在test2回來後,都會失效。例如A是一個分頁的列表頁面,翻到第二頁後轉向B,那麼當回到A後,就無法地位到第二頁。
原因分析
我先用firebug看了一下html的結構,發現jQuery Mobile會把main和test1加入到頁面結構中去,當從test1轉向到test2後,test1會被自動刪除,這樣dom樹中,只包含了main和test2,所以在test2回傳test1就會在傳送一個get請求。那是不是意味著,只要能把歷史頁面快取到dom中(就像main和test1一樣),就可以解決這個問題。
解決問題
經過一番查找,在jQuery Mobile官網看到一段《Caching pages in the DOM》的描述:
Caching pages in the DOM
To keep all previously-visited pages in the DOM, set the domCache option on the page plugin to true, like this:
$.mobile.page.prototype.options.domCache = true;
Alternatively, to cache just a particular page, you can add the data-dom-cache="true" attribute to the page's container:
所以對於目前大多數應用,這個方案是不可取的,除非自己管理dom中頁面的生命週期。
最佳化方案
透過上面的實驗,我也知道了需要滿足我的需求,就只能自己管理dom中頁面的生命週期了。那麼就涉及到一個問題:頁面什麼時候過期(即從dom中刪除)呢?根據我的需求,從test2回到test1時,就應該從dom中刪除test2,同理從test1回到main時,從dom中刪除test1。如果再次從main導航到test1,就得發起一個get請求,我認為這是合理的,因為使用者不會認為點擊連結到新頁面還需要快取。所以我應該在頁面顯示前或顯示後,刪除它之後的history,於是我就在pagebeforeshow、pageshow的時候做了刪除操作,即如下腳本(插件形式):
(function($, undefined) { $.fn.subpage = function(options) { $(document).bind( "pagebeforeshow", function() { var forword = $.mobile.urlHistory.getNext(); if (forword) { var dataUrl = forword.url; var forwordPage=$.mobile.pageContainer .children(":jqmData(url='" + dataUrl + "')"); if(forwordPage){ forwordPage.remove(); } } $.mobile.urlHistory.clearForward(); }); }; $(document).bind("pagecreate create", function(e) { $(":jqmData(role='page')", e.target).subpage(); }); })(jQuery);
結果事與願違,在頁面返回時,出現了js腳本錯誤,如下圖:
那麼是什麼原因呢?不在這個事件裡做處理,那在哪裡處理呢?於是我仔細研讀了一下jQuery Mobile源碼,發現了下面一段:
transitionPages( toPage, fromPage, settings.transition, settings.reverse ) .done(function() { removeActiveLinkClass(); //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden if ( settings.duplicateCachedPage ) { settings.duplicateCachedPage.remove(); } //remove initial build class (only present on first pageshow) $html.removeClass( "ui-mobile-rendering" ); releasePageTransitionLock(); // Let listeners know we're all done changing the current page. mpc.trigger( "pagechange", triggerData ); });
頁面在切換完後,會觸發pagechange事件,於是我把pagebeforeshow改成了pagechange,一切都按預期運行,並且沒有錯誤,終於大功告成了。
總結
使用該外掛程式時,請注意以下幾點:
1、必須在引用該腳本之前,引用jquery和jquery mobile腳本檔;
2、必須在page上增加data-dom-cache="true"。
以上所述是小編給大家介紹的jQuery Mobile頁面回傳不需要重新get 的相關說明,希望對大家有幫助!