// 前端很多MVC都有路由模塊,但兼容多瀏覽器的代碼比較多。
// 這里根據(jù)H5新api popstate,監(jiān)聽(tīng)路由變化,注冊(cè)一到多個(gè)處理函數(shù),沒(méi)有兼容舊版瀏覽器的部分,代碼量更少更簡(jiǎn)單,可獨(dú)立使用。
// 處理函數(shù)接收hash部分,可參考backbone自行解析
// 已在線上運(yùn)行
var Router = (function () {
var win = window;
/*
* 設(shè)置路由
*/
var getHash = function (url) {
url = url || win.location.href;
var match = url.match(/#(.*)$/);
return match ? match[1] : '';
};
var routeHandleCache = [];
function iterateRegistry(handles) {
var hash = getHash();
for (var i = 0, len = handles.length; i < len; i++) {
var handleFunc = handles[i];
if (!handleFunc) {
continue
} else {
var result = handleFunc(hash);
if (result === true) {
return
} else {
continue
}
}
}
}
return {
getHash: getHash,
//這里的注冊(cè)將處理函數(shù)push進(jìn)數(shù)組,hash發(fā)生改變是依次調(diào)用數(shù)組里的每個(gè)處理函數(shù),處理函數(shù)自己決定如何處理,感覺(jué)這是最通用的
registry: function (handles) {
if ((typeof handles) == 'function') {
handles = [handles]
}
routeHandleCache = routeHandleCache.concat(handles);
if (this.started) {
iterateRegistry(handles);
}
//console.log('注冊(cè)處理函數(shù)', routeHandleCache)
},
navigate: function (hash) {
hash = hash || '';
var url = hash.indexOf('#') == 1 ? hash : '#' + hash;
location.href = url;
},
toView: function (path) {
Router.navigate(path)
},
/**
* 頁(yè)面一開(kāi)始沒(méi)有hash,這個(gè)時(shí)候page或許也都沒(méi)注冊(cè),所以需要一個(gè)啟動(dòng)函數(shù),在page注冊(cè)后處理hash為''的情況
*/
start: function () {
var __initRegistry = false;
win.addEventListener('popstate', function () {
this.started = true;
iterateRegistry(routeHandleCache);
__initRegistry = true;
}.bind(this));
//修復(fù)部分瀏覽器默認(rèn) 首次進(jìn)入頁(yè)面會(huì)執(zhí)行次popstate,某些不會(huì)的差異情況修復(fù)
setTimeout(()=> {
if (!__initRegistry) {
iterateRegistry(routeHandleCache);
}
}, 200);
this.navigate(getHash())
}
};
})();
module.exports = Router;
H5路由控制
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 原文地址:http://www.insp.top/article/10 目前我們大致了解了laravel下,在開(kāi)始...
- Express實(shí)現(xiàn)路由分發(fā)控制、RESTful API 標(biāo)簽(空格分隔): Node.js 最近在用Express...
- 最近在做個(gè)項(xiàng)目,是關(guān)于angularJx的。 不知為啥:粘貼過(guò)來(lái)沒(méi)有鎖進(jìn)格式了,這里先做個(gè)記錄,每天都熬到2點(diǎn)的學(xué)...
- 從零學(xué)Laravel目錄列表 我們之前都是將一個(gè)閉包函數(shù)作為第二個(gè)參數(shù)傳入到Route類對(duì)應(yīng)的方法中,但是這種方式...
- category 使用場(chǎng)景 1.為已經(jīng)存在的類添加方法。 2.可以把類的實(shí)現(xiàn)放到不同的文件中。 3.聲明私有方法。...