H5路由控制

// 前端很多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;
最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容