非框架, 純原生JS “商品詳情跳轉到商品列表,並記錄高度“ 的寫法思路


這里只講思路,不提供代碼。

 

寫之前,我要先吐槽一種非常奇葩的寫法。    下面是他的寫法思路(雖不提倡,但可借鑒):

一個商品列表,然后把商品詳情寫在商品列表里。    這是一個頁面,兩個不一樣的div標簽,一個div標簽是商品列表,另一個div標簽是商品詳情   

從商品列表跳轉到商品詳情的操作是:
  請求商品詳情接口,請求到后賦值(在jq項目里特地引了個vue來雙向綁定),
  把當前頁面的高度記錄下來($document.scrollTop()獲取高度),
  然后把商品列表div標簽隱藏掉,然后再顯示商品詳情div標簽。
從商品詳情回退到商品列表的操作是:
  點擊商品詳情頁面里回退按鈕 ,觸發toIndex方法,
  toIndex方法主要寫的是
  隱藏商品詳情div標簽,顯示商品列表div標簽,並用$("html,body").scrollTop(剛記錄的高度)   回退到剛剛的位置

優點:

  簡單粗暴。

  商品詳情頁,回退到列表,秒回退(回退速度最快,因為是同一個頁面。)。

缺點:

  以后擴展功能,只能承認自己技術菜,這實現不了,那實現不了,因為我們沒有商品詳情頁。

  沒有瀏覽器回退功能。

  代碼冗余程度:每多一個列表頁面,就多上100%。

  刷新商品詳情頁后是商品列表頁

 

 

 

上面的寫法,是老項目的寫法,反正我是很不理解這種寫法。

言歸正傳,我們來講其他三種不一樣的寫法吧。(我目前已知的有三種)

 

 

一、獨立一個商品詳情頁,商品列表頁跳轉時需緩存數據和高度。(大多數公司正常的寫法,常規寫法)

商品詳情頁和商品列表頁是獨立的兩個頁面。


商品列表頁到商品詳情頁的操作:
  記錄當前列表的高度,並緩存,緩存當前列表的列表數據,緩存到sessionStorage(你也可以根據情況緩存到localStorage,cookie) 然后,location.href 跳轉到商品詳情頁。


商品詳情頁回退到商品列表頁的操作:
  商品詳情頁,直接是瀏覽器回退,沒其他操作。
  商品列表頁,先通過document.referrer判斷來源是不是商品詳情頁,  如果是,則從緩存里取出列表數據和列表高度。  如果不是,則重新請求接口獲取數據。

 優點:

  1、商品詳情頁只做商品詳情頁的事(商品詳情頁的邏輯統一處理)。

  2、刷新商品詳情頁后,回退到列表頁,也記錄列表數據和位置。(不知道算缺點還算優點,  可以特殊問題到時候特殊處理。)

缺點:

  1、回退到列表頁的時候,部分瀏覽器 ,會有那么一瞬間,先到頂部再到剛剛瀏覽的高度。

  2、如果有個需求是商品詳情頁跳轉到商品列表頁的需求,則會跟我們這里的邏輯有沖突。(特殊邏輯到時候特殊處理。)

 

 

二、利用template.js模板引擎寫一個商品詳情頁,掛在列表上。  (從上面那種奇葩式寫法得到的啟發,因為速度最快。     也是我的一種備用方案,真正方案是后面第三種思路。)

template.js模板引擎。寫個商品詳情的模板。

商品列表引入 template.js、商品詳情js模板、商品詳情js邏輯、商品詳情css
商品列表頁到商品詳情頁的操作:

  把當前頁面的高度記錄下來($document.scrollTop()獲取高度),

   請求商品詳情接口,請求到后 渲染商品詳情模板,然后插入到商品詳情的div內。

   顯示商品詳情div標簽,隱藏商品列表div標簽   

 

 商品詳情頁到商品列表頁的操作:

  點擊商品詳情頁面里回退按鈕 ,觸發toIndex方法,
  toIndex方法主要寫的是
  隱藏商品詳情div標簽並清空商品詳情div標簽內的內容,顯示商品列表div標簽,並用$("html,body").scrollTop(剛記錄的高度)   回退到剛剛的位置

優點:

  商品詳情模板只做商品詳情頁的事(商品詳情的邏輯統一處理)。

缺點:

  1、沒有商品詳情頁。

  2、沒有瀏覽器回退功能。

  3、刷新商品詳情頁后是商品列表頁。

 

三、在第二種的方法上,加上瀏覽器攔截,擴展一個商品詳情頁。

第二種方法

1、沒有商品詳情頁。
  我們就加一個商品詳情頁的頁面,直接引入template.js、商品詳情js模板、商品詳情js邏輯、商品詳情css。   然后根據url里的參數去請求商品詳情接口。
2、沒有瀏覽器回退功能。
  利用window的popstate事件,     來攔截瀏覽器回退和跳轉,  攔截到后,使其執行自己的toindex方法。
3、刷新商品詳情頁后是商品列表頁。
  利用history的pushState和replaceState方法      來添加或更改  瀏覽器url地址。


商品列表頁到商品詳情頁的操作:
  把當前頁面的高度記錄下來($document.scrollTop()獲取高度),

   請求商品詳情接口,請求到后 渲染商品詳情模板,然后插入到商品詳情的div內。

   顯示商品詳情div標簽,隱藏商品列表div標簽,  用pushState改成真正的商品詳情地址,不跳轉(假跳轉),添加history瀏覽記錄

  

商品詳情頁到商品列表頁的操作:
  點擊商品詳情頁面里回退按鈕   或者  使用瀏覽器回退功能(會被攔截的)。       觸發toIndex方法,  
  toIndex方法主要寫的是
  隱藏商品詳情div標簽並清空商品詳情div標簽內的內容,顯示商品列表div標簽,並用$("html,body").scrollTop(剛記錄的高度)   回退到剛剛的位置


商品詳情頁到商品詳情頁的操作:

   請求商品詳情接口,請求到后 渲染商品詳情模板,然后插入到商品詳情的div內。

   顯示商品詳情div標簽,隱藏商品列表div標簽,  用replaceState替換真正的商品詳情地址,不跳轉(假跳轉),不添加history瀏覽記錄

優點:

  1、商品詳情模板只做商品詳情頁的事(商品詳情的邏輯統一處理)。

  2、有商品詳情頁,商品詳情頁獨立一個頁面。

  3、實現瀏覽器回退功能。

缺點:

  1、商品詳情頁刷新后,回退到列表頁,不記錄位置。(這算個缺點)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM