如圖:
在開發一個p2p網站的過程中遇到這樣的問題:
即使用二級路由加載頁面(目的是爲了不讓頁面刷新)
這裏文件的獲取同樣是通過ajax請求實現的
問題在於每一次點擊二級路由加載頁面時
瀏覽器都會重新加載一次一級頁面,personal.html,如圖:
源代碼如下:
於是我嘗試做一個改進,
通過hash的值進行判斷,當前頁面是否爲personal頁面:
如果是:那麼不用加載personal.html,直接加載二級頁面;如果不是:那就加載一級頁面,再加載其對應的二級頁面;
改進如下:
我發現,因爲一級頁面本身就是通過判斷hash值來決定加載的,而一開始如果不在個人中心頁,那麼就必須先加載"#personal"頁面,而如果在個人中心頁面,那就說明hash值"#personal"是被加載過的,但又因爲二級路由需要放在一級路由的回調函數中(爲了消除異步,實現同步),所以可以認爲,當我使用hash來判斷頁面的加載情況時,一二級頁面是綁定在一起的,即只要想加載二級頁面,就必須先加載一級頁面,所以無法通過判斷一級hash值決定二級頁面是否加載。
於是我們換個思路,直接通過判斷當前主頁面內一級頁面中必然含有的dom結構的存在情況來判斷是否再次加載一級頁面,先找到personal的dom節點:
再在index.js裏修改:
這樣就可以實現在personal頁面中點擊二級頁面時,不會重複加載personal頁面了,圖中圈住的地方要注意,判斷一個對象是否存在,不能直接寫:,因爲在jq中$符號包住的東西,不管是什麼,都會被解析爲一個對象,裏面有一些固有屬性名和值,所以這樣判斷會永遠返回true:
所以我們通過$對象中的length屬性來判斷是否存在該節點:
如果在頁面中:那麼length就存在
如果沒在:那麼length就不存在:
其實這裏之前還遇到一個問題,原本二級路由加載的代碼我是這樣寫的:
運行出來發現二級頁面顯示不出來,原因是:load方法是異步執行的
百度了一下:
在jQuery中對Ajax進行了封裝,異步請求的方法共分爲三層:
最底層:$.ajax();中間層:$.get()、$.post()、load();最高層爲:$.getScript()、$.getJSON()。
所以load裏面有個回調函數可以寫,就是我們要寫的二級路由的加載;