1. 程式人生 > >renren開源導航欄點選同一選單不重新整理頁面問題

renren開源導航欄點選同一選單不重新整理頁面問題

最近一個專案使用了renren-security這個開源框架,先縱覽一下外觀,
在這裡插入圖片描述

嗯,確認過眼神,是傳統管理後臺的樣子~

使用過程中發現,當在導航欄中點選同一選單時,iframe並不會重新整理,其實這也不算個問題,奈何產品經理就要這個功能,只好看看人家原始碼是怎麼寫的了,很容易在index.js中就找到了控制路由的程式碼(真正的開源應當如此**):

function routerList(router, menuList) {
    for (var key in menuList) {
        var menu = menuList[key];
        if (menu.type == 0) {
            routerList(router, menu.list);
        } else if (menu.type == 1) {
            router.add('#' + menu.url, function () {
                var url = window.location.hash;
                //替換iframe的url
                vm.main = url.replace('#', '');
                //導航選單展開
                $(".treeview-menu li").removeClass("active");
                $("a[href='" + url + "']").parents("li").addClass("active");
                vm.navTitle = $("a[href='" + url + "']").text();
            });
        }
    }
}

很明顯,這是一個遞迴演算法,將所有選單逐層“註冊”,通過menu.type來區分是父選單(無跳轉)還是子選單(需要跳轉),並對需要跳轉的子選單添加了回撥方法,觸發條件就是’#’ + menu.url。此時,大家應該明白為何點選同一選單不重新整理頁面了,因為瀏覽器中的連結跟’#’ + menu.url還是一致的,所以就不會觸發回撥。
找到了問題所在,那就好下手解決了,分兩步走:
1.同一選單也要觸發回撥
2.iframe的主動重新整理
我們發現替換iframe的url是window.location.hash,首先了解一下window.location.hash和window.location.href。
window.location.href:對應完整的url,可以跳轉頁面,也可以獲取連結
window.location.hash:獲取或設定錨鏈接,不會跳轉頁面
知道了以上,我們就能解決1了,在每次觸發回撥後將當前頁面的錨鏈接修改一下,這樣保證瀏覽器中的連結跟註冊的’#’ + menu.url不一致,那麼怎樣修改連結還能保持是同一個頁面呢?顯然,加時間戳引數:

window.location.hash=url+"?t="+new Date().getTime();

再來解決2,此時雖然點選同一選單都會觸發回調了,但是vm.main = url.replace(’#’, ‘’)取到的url始終是同一個,表現到頁面上就是,瀏覽器地址不斷在重新整理,但是iframe並沒有重新整理,所以我們需要主動重新整理iframe。
由於iframe是巢狀在index.html中的,這裡需要在父頁面來重新整理子頁面,給iframe一個定義一個id為childIframe,通過以下程式碼來重新整理iframe:

$("#childIframe")[0].contentWindow.location.reload(true)

如果你沒有用JQuery,也可以用原生寫法:

document.getElementById('childIframe').contentWindow.location.reload(true);

以上2步,就實現了點選同一選單也重新整理頁面的功能,但是在使用中發現,如果在一個iframe中通過window.location.href跳轉了新頁面,那麼再點選同一選單的時候,重新整理的是二級頁面,造成這個問題的原因很簡單,因為window.location.href已經改變了瀏覽器中的地址,vm.main得到的是二級頁面的地址,所以在跳轉二級頁面的時候,我們不使用window.location.href,而是給vm.main賦二級頁面的地址,並且重新整理iframe,此時雖然跳轉到了二級頁面,但是瀏覽器中的地址並沒有變化,再點選同一選單,自然會重新整理一級頁面。
在index.js中抽象出一個統一的跳轉方法:

function goNext(url) {
    vm.main = url;
    $("#childIframe")[0].contentWindow.location.reload(true);
}

在需要跳轉的地方通過parent物件來呼叫父頁面的這個goNext方法:

parent.goNext("modules/**/**.html?t="+new Date().getTime());

重新整合一下routerList方法:

function routerList(router, menuList) {
    for (var key in menuList) {
        var menu = menuList[key];
        if (menu.type == 0) {
            routerList(router, menu.list);
        } else if (menu.type == 1) {
            router.add('#' + menu.url, function () {
                var url = window.location.hash;
                   //替換iframe的url
                    goNext(url.replace('#', ''));
                   $(".treeview-menu li").removeClass("active");
                   $("a[href='" + url + "']").parents("li").addClass("active");
                   vm.navTitle = $("a[href='" + url + "']").text();
                   window.location.hash=url+"?t="+new Date().getTime();
            });
        }
    }
}

相關推薦

renren開源導航同一選單重新整理頁面問題

最近一個專案使用了renren-security這個開源框架,先縱覽一下外觀, 嗯,確認過眼神,是傳統管理後臺的樣子~ 使用過程中發現,當在導航欄中點選同一選單時,iframe並不會重新整理,其實這也不算個問題,奈何產品經理就要這個功能,只好看看人家原始碼是怎

CSS+JS製作導航選中效果

案例一:日曆選中(li) 示例如圖: 預設選中第一個:週一,如圖: 點選週二,如圖: JS程式碼: <script type="text/javascript">

js實現頁面滾動切換導航/導航跳轉到指定位置

最近一直在弄頁面的事情,對頁面方面的知識又鞏固了一下。這次的內容如題,大家對程式碼有疑問或者是有更好的方法歡迎留言!js部分        //標題物件      var title = document.getElementById("title");        //選

jQuery左側固定導航滑動對應頁面

<!DOCTYPE HTML> <html> <head> <title>導航定位</title> <meta charset="utf-8"> <meta name="Generat

ios 導航 barbutton的按鈕 下拉列表

環境:xocde5.0.2+ios7.0.1 1、導航欄 ----點選科目--------下拉列表 程式碼:NGRightTableViewViewController.h #import <UIKit/UIKit.h> @protocol Pulldow

回退按鈕重新整理頁面

瀏覽器使用者返回上一步,自動重新整理 window.onunload=function(){} 這個最簡單粗暴 方式一、 <input type="hidden" id="refreshed" value="no"> <script type="text/javascrip

微信小程式關於tabbar切換資料重新整理問題

微信小程式中經常遇到的需求就是我提交了一個表單或者進行了一個操作,需要在我的個人中心頁面中實時顯示出來,但是小程式中的tabbar切換類似於tab切換 並不會進行頁面重新整理請求 所以總是會造成一些資料更新不及時問題 而閱讀小程式文件發現了小程式是給提供瞭解決辦法的 onShow /** * 生命週期

用vue+Element-ui寫一個後臺管理介面,頭部導航對應顯示下方左側導航選單,左側選單對應顯示右邊內容,右邊內容的按鈕出現一個新頁面依舊能夠選中左側相應選單,求解決???!!!!

vue-路由 用vue+Element-ui寫一個後臺管理介面,點選頭部導航對應顯示下方左側導航選單,點選左側選單對應顯示右邊內容 但是點選新建微帖路由出現一個新頁面,左側選單怎麼才能顯示被選中狀態,就是跟上圖狀態一樣??? 這裡是左側選單導航和右邊內容顯示區域程式碼 這裡是頁面按鈕

左側選單生成選項卡js程式碼

js 程式碼部分 /*建立iframe*/ function creatIframe(href,titleName){     var topWindow=$(window.parent.document),         show_nav=topWindow.find(

Vue 選單切換單個class(高亮),超簡單!

步驟: 遍歷物件(goods)獲取選單欄每一項的物件(item)和下標(index) 新增點選事件toggle(),傳入下標引數:@click="fn1();fn2()" 動態切換classname::class="{'active':index ==che

ios 導航 擊barbutton的按鈕 下拉列表

pro source war sin nload mutable mst kit with 環境:xocde5.0.2+ios7.0.1 1、導航欄 ----點擊科目--------下拉列表 代碼:NGRightTableViewViewControlle

左側豎條導航擊出現效果的實現

導航欄大部分的網站導航欄都是在網頁的頂端,這類導航欄看起來非常一般,而有些在左側豎著顯示的導航欄就比較好看一些了,但是今天為大家介紹的是左側豎條導航欄實現點擊出現的效果,也就是剛開始只顯示導航,不顯示分類欄,而點擊導航就可以顯示分類欄了,下面一起來看下源代碼的實現吧。<!DOCTYPE html>

vue頭部導航動態處理

1:DATA中兩個變數, data:  {              nav:['頭條1','頭條2'],      

python學習之網站的編寫(HTML,CSS,JS)(十六)----------示例,構造一個左側管理選單的功能,選單才顯示下面的內容

結果: 程式碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行舟不進則退</title>

win10開始選單無效???定位並徹底解決win10開始選單及使用者功能失效問題

這段時間偶爾出現開啟電腦後,進入歡迎頁面,背景正常顯示,滑鼠可以移動,右下角出現網路設定、關機等按鈕,但是很長時間才出現使用者頭像和開始按鈕(3分鐘以上),點選開始按鈕後進入電腦主頁,卻發現左下角開始按鈕點選無效,同時,右下角的網路設定、聲音等都點選無效,桌面右鍵個性化和顯示設定

1.angular html+css+js導航樣式修改,加跳轉頁面

 1.html頁面程式碼如下: <div class="main-menu" id="L1" (click)="Tab(1)" style="color:#3bb9e2;"> 主頁 </div> <div class="main-menu

系統導航左右上角按鈕如何需要定義就可以新增小紅

最近做一個需求,要在系統導航欄右上角按鈕加上一個小紅點,以前博主習慣使用自定義導航欄,所以並不怎麼和系統的東西打交道,那怎麼辦?求助度娘唄,查了一會,都是自定義按鈕,也沒什麼比較快捷的方法,於是就自己去看系統UIBarButtonItem,這一看不打緊,還真讓博

react 模擬從後臺獲取選單資料,頂部選單切換介面的筆記

 本文是基於Ant design Pro 2.0做的筆記,官方提供的demo(官方demo下載地址),路由是程式配置的,不能滿足專案需求,所以在研究過程中,把所遇到的問題,做一個筆記,最終效果圖如下:   一:需求描述   1 從介面獲取選單,替換預設demo的選單。   &n

Windows電腦開始選單無反應

開啟電腦後發現左鍵點選開始選單沒有任何反應,旁邊的搜尋視窗也不可輸入,小娜也喚不醒,只有在選單上右鍵沒有問題。 可以嘗試以下解決方法:    1、右鍵選單欄或ctrl+alt+delete,開啟工作列管理器,在程序選項卡中拉到最下面,找到桌面視窗管理器,選中它,再點選結束任

mui 底部選單,顯示不同的頁面

效果: 原始碼:       <!DOCTYPE html> <html>     <head>         <m