2014-12-01 73 views
1

我正在用導航功能構建一個小型單頁應用程序。頁面位於div容器中,通過點擊鏈接顯示。該頁面changig代碼history.pusht狀態/後退按鈕/在單個頁面中導航應用程序

 // show the given page, hide the rest 
     function show(elementID) { 
      history.pushState({ 
       plate_id: 1, 
       plate: elementID 
      }, null, elementID); 
      goTo(elementID); 
     } 
     function goTo(elementID) { 
      var ele = document.getElementById(elementID); 
      if (!ele) { 
       console.log("fail"); 
       return; 
      } 
      // get all pages, loop through them and hide them 
      var pages = document.getElementsByClassName('page'); 

      for(var i = 0; i < pages.length; i++) { 
       pages[i].style.display = 'none'; 
      } 
      // then show the requested page 
      ele.style.display = 'block'; 
     } 
     window.onpopstate = function (event) { 
       var content = ""; 
       if(event.state) { 
       content = event.state.plate; 
       } 
       if (content != '') goTo(content); 
     } 

的鏈接看起來像

<a href="#" onclick="show('Page_1');" id="1">page 1</a> 

和div的

<div id="Page_1" class="page" style=""> 

現在,當我使用某個鏈接的網址更改爲.../Page_1#或.../Page_2#頁面直接顯示。現在,如果我使用後退按鈕(自己或瀏覽器無關緊要),會發生一些我不明白的魔法。

例如

  1. 上點擊第一連桿 - >去../Page_1#(直接,everythinks細)上謝勝利鏈路
  2. 點擊 - >去../Page_2#(直接, everythinks罰款)
  3. 使用後退按鈕 - >再次使用後退按鈕去../Page_2(不包括#和什麼也沒有發生,但應該去PAGE_1 ??? !!)
  4. - >去../Page_1# (什麼也沒有發生)
  5. 再次使用後退按鈕 - >轉到../Page _1(頁面1正在加載)

我不明白爲什麼在第3步和第4步發生思考!這將是很好,如果有人可以幫助我

回答

1

也許你想你的鏈接的onclick是:onclick="show('Page_1'); return false;"onclick="return show('Page_1');"和你的節目的功能與return false;完成。

通過返回false,瀏覽器實際上不會遵循href="#",而只是執行JavaScript代替。

+0

嗯,這對我的作品!謝謝!我對編程感興趣,試圖以「乾淨」的方式實現思考......所以這很好,還是有其他選擇只是一點點「專業」?! – Linda 2014-12-02 08:19:38

+0

還有一些其他問題...如果我去page1,然後到page2等URL更改爲.../page1,.../page2等等。現在,如果用戶觸摸刷新按鈕,他將得到一個404錯誤,因爲它只是一個頁面的應用程序,而且通緝的網址不會激化。那麼刷新按鈕有沒有解決方法? – Linda 2014-12-02 08:29:14

+0

在這種情況下,您可能希望它們看起來像這樣:「http://example.org/bla?Page_1」而不是像「http:// example.org/bla/Page_1」那樣的URL '。注意問號:)。我假設'bla'是你的web應用程序的'html'文件,並且服務器將它重定向到'bla.html'。 – evilham 2014-12-02 11:50:35

0

我會這樣做與AngularJS,因爲你不必關心history.js。它開箱即用。

請檢查下面的演示,讓你開始。你也可以在jsFiddle here找到相同的代碼。

在鏈接活動類沒有正確設置,但這並不難。這在AngularJS的一些例子中以及在這裏描述。看到這個SO question

'use strict'; 
 

 
var pageTemplate = "<div>{{page.title}}<div>"; 
 
var pageTitles = ['Page1', 'Page2']; 
 

 
var app = angular.module('routingDemo', ['ngRoute']); 
 

 
app.config(['$routeProvider', '$locationProvider', 
 

 
function ($routeProvider, $locationProvider) { 
 
    //$locationProvider.html5Mode(true); 
 

 
    $routeProvider. 
 
    when('/', { 
 
     //templateUrl: 'partials/phone-list.html', 
 
     template: "<div>main page</div>", 
 
     //controller: 'MainCtrl' 
 
    }). 
 
    when('/pages/:pageId', { 
 
     //templateUrl: 'partials/phone-detail.html', 
 
     template: pageTemplate, 
 
     controller: 'PagesCtrl' 
 
    }). 
 
    otherwise({ 
 
     redirectTo: '/' 
 
    }); 
 
}]); 
 

 
app.controller('PagesCtrl', ['$scope', '$routeParams', function ($scope, $routeParams) { 
 
    $scope.page = { 
 
     'title': pageTitles[$routeParams.pageId - 1] 
 
    }; 
 
}]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="http://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.3/angular.js"></script> 
 
<script src="https://code.angularjs.org/1.2.6/angular-route.min.js"></script> 
 
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script> 
 
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet"/> 
 

 
<div ng-app="routingDemo"> 
 
    <nav class="navbar navbar-default" role="navigation"> 
 
     <div class="navbar-header"> 
 
      <a class="navbar-brand" href="#/">Static pages demo</a> 
 
     </div> 
 
     <div> 
 
      <ul class="nav navbar-nav"> 
 
       <li class="active"><a href="#/pages/1">Page 1</a></li> 
 
       <li><a href="#/pages/2">Page 2</a></li> 
 
      </ul> 
 
     </div> 
 
    </nav> 
 
    <div class="container" ng-view></div> 
 
</div>

相關問題