最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js單頁(yè)hash路由原理與應(yīng)用實(shí)戰(zhàn)詳解

 更新時(shí)間:2017年08月14日 15:54:38   作者:ghostwu  
本篇文章主要介紹了js單頁(yè)hash路由原理與應(yīng)用實(shí)戰(zhàn)詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文主要介紹了js單頁(yè)hash路由原理與應(yīng)用實(shí)戰(zhàn)詳解,分享給大家,具體如下:

什么是路由?

通俗點(diǎn)說(shuō),就是不同的URL顯示不同的內(nèi)容

什么是單頁(yè)應(yīng)用?

單頁(yè),英文縮寫(xiě)為SPA( Single Page Application),就是把各種功能做在一個(gè)頁(yè)面內(nèi). 那所謂的單頁(yè)路由應(yīng)用就是:在一個(gè)頁(yè)面內(nèi),通過(guò)切換地址欄的URL來(lái)實(shí)現(xiàn)切換內(nèi)容的變化.

如何知道URL切換了呢?

當(dāng)url后面的錨文本發(fā)生變化時(shí), 會(huì)觸發(fā)onhashchange事件。通過(guò)這個(gè)事件,我們就可以對(duì)不同的URL 做出不同的處理。錨文本就是 URL中 #后面的內(nèi)容,比如:

#/html

#/css

#/javascript

<a href="#/html" rel="external nofollow" rel="external nofollow" >html課程</a> 
<a href="#/css" rel="external nofollow" rel="external nofollow" >css課程</a> 

window.onload = function(){
      //當(dāng)hash發(fā)生變化的時(shí)候, 會(huì)產(chǎn)生一個(gè)事件 onhashchange
      window.onhashchange = function(){
        console.log( '你的hash改變了' );
        //location對(duì)象是 javascript內(nèi)置的(自帶的)
        console.log( location );
      }
    }

上例,我們已經(jīng)通過(guò)hash( 就是錨文本 ) 變化, 觸發(fā)了onhashchange事件, 就可以把hash變化 與 內(nèi)容 切換對(duì)應(yīng)起來(lái),就實(shí)現(xiàn)了單頁(yè)路由的應(yīng)用!

接下來(lái),我們通過(guò)一個(gè)小的彩票程序,來(lái)體驗(yàn)下單頁(yè)路由:

 <input type="button" value="33選5">
 <div></div>
window.onload = function(){
      var oBtn = document.querySelector("input");
      var oDiv = document.querySelector("div");
      //33->max 5->num
      function buildNum( max, num ){
        var arr = [];
        for( var i = 0; i < max; i++ ){
          arr.push( i + 1 );
        }
        var target = []; //從1-33這33個(gè)數(shù)字中 隨機(jī)選出5個(gè)數(shù)
        for( var i = 0; i < num; i++ ){
          target.push( arr.splice( Math.floor( Math.random() * arr.length ), 1 ) );
        }
        return target;
      }
      oBtn.onclick = function(){
        var num = buildNum( 33, 5 );
        oDiv.innerHTML = num;
        location.hash = num;
      }
      window.onhashchange = function(){
        oDiv.innerHTML = location.hash.substring(1);
      }
    }

上例,我們通過(guò)1-33個(gè)數(shù)字,生成5個(gè)隨機(jī)數(shù),放入Div中,  每次生成一組隨機(jī)數(shù)就更新div的內(nèi)容,  最后通過(guò)瀏覽器的前進(jìn),后退按鈕,就可以感覺(jué),所有的隨機(jī)切換內(nèi)容像是在切換不同的URL頁(yè)面, 實(shí)際的效果是沒(méi)有切換任何頁(yè)面,完全是在一個(gè)頁(yè)面中通過(guò)hash變化實(shí)現(xiàn)內(nèi)容切換.

最后,我們結(jié)合html5簡(jiǎn)單的排版,利用hash來(lái)做一個(gè)選項(xiàng)卡切換的功能:

header,
    footer {
      height: 100px;
      background: #ccc;
    }

    section {
      width: 60%;
      height: 400px;
      background: #eee;
      float: left;
    }

    sidebar {
      width: 40%;
      height: 400px;
      background: #999;
      float: left;
    }

    .clear {
      clear: both;
    }

<header>
    頭部
  </header>
  <section>
    <ul>
      <li><a href="#/" rel="external nofollow" >全部</a></li>
      <li><a href="#/html" rel="external nofollow" rel="external nofollow" >html課程</a></li>
      <li><a href="#/css" rel="external nofollow" rel="external nofollow" >css課程</a></li>
      <li><a href="#/javascript" rel="external nofollow" >javascript課程</a></li>
    </ul>
  </section>
  <sidebar>
    右邊
  </sidebar>
  <div class="clear"></div>
  <footer>
    底部
  </footer>
(function(){
      var Router = function(){
        /*
          this.routes['/'] = function(){}  
          this.routes['/html'] = function(){}
        */ 
        this.routes = {};//用來(lái)保存路由
        this.curUrl = ''; //獲取當(dāng)前的hash
      }
      Router.prototype.init = function(){ //監(jiān)聽(tīng)路由變化
        //call,apply
        window.addEventListener( 'hashchange', this.reloadPage.bind(this) );
      }
      Router.prototype.reloadPage = function(){
        this.curUrl = location.hash.substring(1) || '/';
        this.routes[this.curUrl]();    
      }
      Router.prototype.map = function( key, callback ){ //保存路由對(duì)應(yīng)的函數(shù)
        this.routes[key] = callback;
        // console.log( this.routes );
      } 
      window.Router = Router;
    })();

    var oRouter = new Router();
    oRouter.init();
    oRouter.map( '/', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = 'ghostwu提供html,css,javascript從0基礎(chǔ)到精通系列課程,只要會(huì)開(kāi)關(guān)機(jī),就能學(xué)會(huì)';
    });
    oRouter.map('/html', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = 'ghostwu提供html5從入門(mén)到精通的課程';
    });
    oRouter.map('/css', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = 'ghostwu提供從入門(mén)到玩轉(zhuǎn)css3課程';
    });
    oRouter.map('/javascript', function(){
      var oSidebar = document.querySelector("sidebar");
      oSidebar.innerHTML = "ghostwu提供從0基礎(chǔ)到精通javascript系列課程";
    });

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能

    基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能

    這篇文章主要為大家詳細(xì)介紹了基于bootstrap實(shí)現(xiàn)多個(gè)下拉框同時(shí)搜索功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Js-$.extend擴(kuò)展方法使方法參數(shù)更靈活

    Js-$.extend擴(kuò)展方法使方法參數(shù)更靈活

    在JS里,我們的方法參數(shù)通常使用JQ的$.extend擴(kuò)展方法來(lái)實(shí)現(xiàn),感興趣的朋友可以了解下
    2013-01-01
  • JavaScript中的View-Model使用介紹

    JavaScript中的View-Model使用介紹

    這是一個(gè)十分常見(jiàn)的微博列表頁(yè)面,類(lèi)似于新浪微博。上周末,在心無(wú)旁騖情況下,一共用了5個(gè)對(duì)象,產(chǎn)出400行代碼,實(shí)踐出一種代碼組織模式。
    2011-08-08
  • 帶你搞懂js的深拷貝

    帶你搞懂js的深拷貝

    這篇文章主要為大家介紹了js的深拷貝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • JS使用tofixed與round處理數(shù)據(jù)四舍五入的區(qū)別

    JS使用tofixed與round處理數(shù)據(jù)四舍五入的區(qū)別

    js中一般使用tofixed與round處理數(shù)據(jù)四舍五入,那么tofixed與round有什么區(qū)別呢?下面小編給大家分享JS使用tofixed與round處理數(shù)據(jù)四舍五入的區(qū)別,需要的朋友參考下吧
    2017-10-10
  • js實(shí)現(xiàn)鼠標(biāo)單擊Tab表單切換效果

    js實(shí)現(xiàn)鼠標(biāo)單擊Tab表單切換效果

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)鼠標(biāo)單擊Tab表單切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • JavaScript實(shí)現(xiàn)多張圖片放大鏡效果示例【不限定圖片尺寸,rem單位】

    JavaScript實(shí)現(xiàn)多張圖片放大鏡效果示例【不限定圖片尺寸,rem單位】

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)多張圖片放大鏡效果,結(jié)合實(shí)例形式分析了javascript實(shí)現(xiàn)不限定圖片尺寸,采用rem單位的多張圖片縮放功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • 微信小程序中的canvas 文字?jǐn)嘈泻褪÷蕴?hào)顯示功能的處理方法

    微信小程序中的canvas 文字?jǐn)嘈泻褪÷蕴?hào)顯示功能的處理方法

    大家都知道在canvas中沒(méi)有提供方法來(lái)處理文字的多行問(wèn)題,只有通過(guò)截取指定字符串來(lái)達(dá)到目的。接下來(lái)通過(guò)本文給大家介紹微信小程序中的canvas 文字?jǐn)嘈泻褪÷蕴?hào)顯示功能 ,需要的朋友可以參考下
    2018-11-11
  • js中的this的指向問(wèn)題詳解

    js中的this的指向問(wèn)題詳解

    這篇文章主要介紹了js中的this的指向問(wèn)題以及相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考學(xué)習(xí)下。
    2019-08-08
  • JS如何使用剪貼板操作Clipboard API

    JS如何使用剪貼板操作Clipboard API

    瀏覽器允許JavaScript腳本讀寫(xiě)剪貼板,自動(dòng)復(fù)制或粘貼內(nèi)容。一般來(lái)說(shuō),腳本不應(yīng)該改動(dòng)用戶的剪貼板,以免不符合用戶的預(yù)期。但是,有些時(shí)候這樣做確實(shí)能夠帶來(lái)方便,比如"一鍵復(fù)制"功能,用戶點(diǎn)擊一下按鈕,指定的內(nèi)容就自動(dòng)進(jìn)入剪貼板。本文將介紹3種方法來(lái)實(shí)現(xiàn)。
    2021-05-05

最新評(píng)論

隆安县| 林芝县| 金沙县| 丰都县| 诸城市| 奈曼旗| 美姑县| 杭州市| 保山市| 郁南县| 武川县| 白玉县| 乌兰浩特市| 阿勒泰市| 东兴市| 阿城市| 兴宁市| 呼玛县| 金秀| 临武县| 岳普湖县| 林口县| 三门峡市| 西盟| 兴安县| 九龙城区| 金山区| 桐庐县| 定远县| 长泰县| 铜陵市| 磐石市| 衡水市| 财经| 西乌珠穆沁旗| 丰顺县| 星子县| 金坛市| 观塘区| 攀枝花市| 枣阳市|