欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

location.hash保存頁面狀態(tài)的技巧

 更新時(shí)間:2016年04月28日 09:14:07   作者:Leo  
hash 屬性是一個(gè)可讀可寫的字符串,該字符串是 URL 的錨部分(從 # 號(hào)開始的部分)。接下來通過本文給大家介紹location.hash保存頁面狀態(tài)的相關(guān)內(nèi)容,感興趣的朋友一起學(xué)習(xí)吧

hash 屬性是一個(gè)可讀可寫的字符串,該字符串是 URL 的錨部分(從 # 號(hào)開始的部分)。

語法

location.hash

在我們的項(xiàng)目中,有大量ajax查詢表單+結(jié)果列表的頁面,由于查詢結(jié)果是ajax返回的,當(dāng)用戶點(diǎn)擊列表的某一項(xiàng)進(jìn)入詳情頁之后,再點(diǎn)擊瀏覽器回退按鈕返回ajax查詢頁面,這時(shí)大家都知道查詢頁面的表單和結(jié)果都回到了默認(rèn)狀態(tài)。

如果每次返回頁面都要重新輸入查詢條件,或有甚者還得轉(zhuǎn)到列表的第幾頁,那這種體驗(yàn)用戶真的要抓狂了。

在我們的項(xiàng)目中,寫了一個(gè)很簡單的JavaScript基類來處理location.hash從而保存頁面狀態(tài),今天在此就分享給大家。

(本文的內(nèi)容可能對于JavaScript初學(xué)者來講有點(diǎn)難度,因?yàn)樯婕暗絁S面向?qū)ο蟮闹R(shí),如定義類、繼承、虛方法、反射等)

先看看我們的需求

我們的項(xiàng)目是一個(gè)基于微信的H5任務(wù)管理系統(tǒng),要完成的頁面原型如下圖所示:

需求應(yīng)該都很清晰,就是點(diǎn)擊查詢表單,用ajax返回查詢結(jié)果,然后點(diǎn)擊列表中的某一個(gè)任務(wù)進(jìn)入任務(wù)詳情頁。由于管理員(項(xiàng)目經(jīng)理)通常會(huì)一次處理多個(gè)任務(wù),所以就會(huì)不斷在任務(wù)詳情頁跟查詢列表頁切換,這時(shí)如果按返回鍵不能保存查詢頁面狀態(tài)的話,那每次返回查詢頁面都要重新輸入查詢條件,這樣的體驗(yàn)肯定是不能忍受的。

所以,我們需要想辦法將頁面狀態(tài)保存下來,以便用戶按回退鍵的時(shí)候,查詢條件和結(jié)果都還在。

解決思路

保存頁面狀態(tài)的思路有很多啦,但是我們覺得用location.hash應(yīng)該是最好的方法。

思路如下:

1.用戶輸入查詢條件并點(diǎn)擊確定后,我們將查詢條件序列化成一個(gè)字符串,并通過“#”將查詢條件加到url后面得到一個(gè)新的url,然后調(diào)用location.replace(新的url)修改瀏覽器地址欄中的地址。

2.當(dāng)用戶按回退鍵回退到查詢頁面時(shí),也可以說是頁面加載時(shí),將location.hash反序列化成查詢條件,然后將查詢條件更新到查詢表單并執(zhí)行查詢即可。

思路很簡單,關(guān)鍵的地方就是location.replace方法,這個(gè)方法不僅僅是修改瀏覽器中地址欄的url,更重要的是會(huì)在window.history中替換當(dāng)前頁面的記錄。如果不用location.replace方法,那么每次回退都會(huì)回退到上一個(gè)查詢條件。當(dāng)然,這樣的需求可能對某些項(xiàng)目還有用。

最終解決方案

如果本文只是分享上面的解決思路,那價(jià)值就不大了。本文的價(jià)值應(yīng)該是我們寫的那個(gè)雖然簡單但是卻很強(qiáng)大的JavaScript類。

如果你看明白了上面的解決思路,那就看看這個(gè)簡單的JavaScript類吧:

(function() {
if (window.HashQuery) {
return;
}
window.HashQuery = function() {
};
HashQuery.prototype = {
parseFromLocation: function() {
if (location.hash === '' || location.hash.length === ) {
return;
}
var properties = location.hash.substr().split('|');
var index = ;
for (var p in this) {
if (!this.hasOwnProperty(p) || typeof this[p] != 'string') {
continue;
}
if (index < properties.length) {
this[p] = properties[index];
if (this[p] === '-') {
this[p] = '';
}
}
index++;
}
},
updateLocation: function() {
var properties = [];
for (var p in this) {
if (!this.hasOwnProperty(p) || typeof this[p] != 'string') {
continue;
}
var value = this[p];
properties.push(value === '' ? '-' : value);
}
var url = location.origin + location.pathname + location.search + "#" + properties.join('|');
location.replace(url);
}
};
})(); 

這個(gè)類只有2個(gè)方法,HashQuery.parseFromLocation() 方法從location.hash反序列化為HashQuery子類的實(shí)例,HashQuery.updateLocation() 方法將當(dāng)前HashQuery子類的實(shí)例序列化并更新到window.location。

可以看到HashQuery這個(gè)類沒有任何屬性,那是因?yàn)槲覀冎欢x了一個(gè)基類,類的屬性都在子類中進(jìn)行定義。這也是符合實(shí)際的,因?yàn)椴樵儣l件都只有在具體的頁面才知道有哪些屬性。

另外,請注意這里的序列化和反序列化。這里的序列化僅僅是利用JavaScript反射機(jī)制將實(shí)例的所有字符串屬性(按順序)的值用“|”分隔;而序列化則是將字符串用“|”分隔后,再利用反射更新到實(shí)例的屬性(按順序)。

如何使用HashQuery類

使用的時(shí)候就非常簡單了。

第一步,定義一個(gè)子類,將需要用到的查詢條件都加到字符串屬性當(dāng)中,如我們的代碼:

(function() {
window.TaskSearchHashQuery = function () {
HashQuery.constructor.call(this);
this.iterationId = '';
this.assignedUserId = '';
this.status = '';
this.keyword = '';
};
TaskSearchHashQuery.constructor = TaskSearchHashQuery;
TaskSearchHashQuery.prototype = new HashQuery();
})(); 

第二步,在查詢頁面調(diào)用HashQuery.parseFromLocation() 和 HashQuery.updateLocation()方法即可。下面的代碼是我們完整的查詢頁面:

(function() {
var urls = {
list: "/app/task/list"
};
var hashQuery = null;
var pager = null;
$(document).ready(function () {
hashQuery = new TaskSearchHashQuery();
hashQuery.parseFromLocation();//在這里調(diào)用的哦,從location反序列化object
updateFormByHashQuery();
$("#btnSearch").click(function() {
updateHashQueryByForm();
hashQuery.updateLocation();//在這里調(diào)用的哦,將查詢條件序列化之后更新到location.hash
$("#lblCount").html("加載中...");
pager.reload();
page.hideSearch();
});
pager = new ListPager("#listTasks", urls.list);
pager.getPostData = function(index) {
return "pageIndex=" + index + "&pageSize=" + "&projectId=" + page.projectId
+ "&iterationId=" + hashQuery.iterationId
+ "&assignedUserId=" + hashQuery.assignedUserId
+ "&status=" + hashQuery.status
+ "&keyword=" + hashQuery.keyword;
};
pager.onLoaded = function() {
$("#lblCount").html("共 " + $("#hfPagerTotalCount").val() + " 個(gè)任務(wù)");
$("#hfPagerTotalCount").remove();
};
pager.init();
});
function updateHashQueryByForm() {
hashQuery.iterationId = $("#ddlIterations").val();
hashQuery.assignedUserId = $("#ddlUsers").val();
hashQuery.status = $("#ddlStatuses").val();
hashQuery.keyword = $("#txtKeyword").val();
};
function updateFormByHashQuery() {
$("#ddlIterations").val(hashQuery.iterationId);
$("#ddlUsers").val(hashQuery.assignedUserId);
$("#ddlStatuses").val(hashQuery.status);
$("#txtKeyword").val(hashQuery.keyword);
};
})(); 

總結(jié)

這就是我們項(xiàng)目中使用location.hash來保存頁面狀態(tài)的全部知識(shí)了。不知道大家的WEB項(xiàng)目中是如何處理這樣的需求的呢?

以上內(nèi)容是小編給大家介紹的location.hash保存頁面狀態(tài)的技巧,希望對大家有所幫助!

相關(guān)文章

  • JS樹形結(jié)構(gòu)根據(jù)id獲取父級節(jié)點(diǎn)元素的示例代碼

    JS樹形結(jié)構(gòu)根據(jù)id獲取父級節(jié)點(diǎn)元素的示例代碼

    這篇文章主要介紹了JS樹形結(jié)構(gòu)根據(jù)id獲取父級節(jié)點(diǎn)元素,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • js+h5 canvas實(shí)現(xiàn)圖片驗(yàn)證碼

    js+h5 canvas實(shí)現(xiàn)圖片驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了js+h5 canvas實(shí)現(xiàn)圖片驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • 15個(gè)簡單的JS編碼標(biāo)準(zhǔn)讓你的代碼更整潔(小結(jié))

    15個(gè)簡單的JS編碼標(biāo)準(zhǔn)讓你的代碼更整潔(小結(jié))

    這篇文章主要介紹了15個(gè)簡單的JS編碼標(biāo)準(zhǔn)讓你的代碼更整潔(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • js表頭排序?qū)崿F(xiàn)方法

    js表頭排序?qū)崿F(xiàn)方法

    這篇文章主要介紹了js表頭排序?qū)崿F(xiàn)方法,涉及數(shù)字、字母、字符串比較及排序等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 詳解如何較好的使用js

    詳解如何較好的使用js

    本文將對在網(wǎng)頁中引用js常會(huì)出現(xiàn)的問題進(jìn)行匯總,并提出解決問題的具體方案,有助于我們更好的學(xué)習(xí)和使用js,需要的朋友一起來看下吧
    2016-12-12
  • js canvas實(shí)現(xiàn)圓形流水動(dòng)畫

    js canvas實(shí)現(xiàn)圓形流水動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了js canvas實(shí)現(xiàn)圓形流水動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 初學(xué)js插入節(jié)點(diǎn)appendChild insertBefore使用方法

    初學(xué)js插入節(jié)點(diǎn)appendChild insertBefore使用方法

    由于可見insertBefore()方法的特性是在已有的子節(jié)點(diǎn)前面插入新的節(jié)點(diǎn)但是兩種情況結(jié)合起來發(fā)現(xiàn)insertBefore()方法插入節(jié)點(diǎn),是可以在子節(jié)點(diǎn)列表的任意位置。
    2011-07-07
  • JavaScript設(shè)計(jì)模式之單件模式介紹

    JavaScript設(shè)計(jì)模式之單件模式介紹

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之單件模式介紹,單件模式,就是靜態(tài)化的訪問中已經(jīng)實(shí)例化的對象,這個(gè)對象只能通過一個(gè)唯一的入口訪問,已經(jīng)實(shí)例或待實(shí)例化的對象,需要的朋友可以參考下
    2014-12-12
  • JS正則驗(yàn)證多個(gè)郵箱完整實(shí)例【郵箱用分號(hào)隔開】

    JS正則驗(yàn)證多個(gè)郵箱完整實(shí)例【郵箱用分號(hào)隔開】

    這篇文章主要介紹了JS正則驗(yàn)證多個(gè)郵箱的方法,且郵箱字符串使用分號(hào)隔開,非常簡單實(shí)用,需要的朋友可以參考下
    2017-04-04
  • Handtrack.js庫實(shí)現(xiàn)實(shí)時(shí)監(jiān)測手部運(yùn)動(dòng)(推薦)

    Handtrack.js庫實(shí)現(xiàn)實(shí)時(shí)監(jiān)測手部運(yùn)動(dòng)(推薦)

    這篇文章主要介紹了實(shí)時(shí)監(jiān)測手部運(yùn)動(dòng)的 JS 庫,可以實(shí)現(xiàn)很多有趣功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02

最新評論