2011-07-29 6 views
9

私は、ブラウザと同じように、私のプロジェクトでバックとフォワードのような機能を実装したい、私たちは画面を持っている。 私が試したことは がintially currentscreenindex=-1ブラウザのような前後の機能を実装する方法

を設定したときに最初の画面のデータがここ

In screen data arrive function(){ 
    this.currentscreenindex++; 
    this.screenvisited[this.currentscreenindex]=data; 

} 

この機能を実行しています私が試したものを私のバック機能であるMは:

back(){ 
    currentscreenindex--; 
    var screen=screenvisited[currentscreenindex]; 
    // will go to this screen 
} 

が、何私の問題はこれらにあります:

    currentscreenindex screen data in screenvisted array 
When 1st screen arrived  0  Data of 1st screen 
When 2st screen arrived  1  Data of 2st screen 
When 3st screen arrived  2  Data of 3st screen 
When 4st screen arrived  3  Data of 4st screen 
When 5st screen arrived  4  Data of 5st screen 
when user click back button 3  call the screen is set to 4th gib, 

このように、4番目の画面のデータが到着すると、現在のインデックスはcurrentindex=4に増加し、現在のインデックス4のデータは4番目の画面になります。currentindex=4のデータが変更されると、私はそれを訂正することができますか?

ブラウザと同じ機能を実行するための適切な前後の関数を書くにはどうすればよいかお勧めします。

+1

を、これはjavascriptのアプリの場合は、ブラウザの履歴に状態を追加するためにURLハッシュとHTML5の履歴を使用することができ、その後、 JS履歴操作コマンドを使用して前後に移動しますか?そうでない場合は、目的を明確にすることができます。 – Wylie

答えて

19

私はあなたが現在それをやっているどのようにこれを収まるだろうかわからないが、あなたは、このような機能を実現することができます。

あなたは2つのスタックを持っています。バックスタックと次のスタック。彼らはどちらも空で始める。ユーザーがリンクまたはバック/フォワード以外の他のナビゲーション方法を使用して新しいページにナビゲートすると、次のスタックをクリアし、現在のページをバックスタックに追加してナビゲーションを続行します。ユーザーがクリックすると、現在のページをフォワードスタックにプッシュし、バックスタックからページをポップし、ポップされたページに移動します。ユーザーがフォワードをクリックすると、現在のページをバックスタックにプッシュし、フォワードスタックからページをポップし、ポップされたページに移動します。

の編集:あなたはので、ここであなたが行く、いくつかの擬似コードを尋ね:

var currentPage=null; 
var backStack=[]; 
var forwardStack=[]; 
function navigate(newPage) { 
    currentPage=newPage; 
    // stub 
} 
function linkClicked(page) { 
    backStack.push(currentPage); 
    forwardStack=[]; 
    navigate(page); 
} 
function goBack() { 
    forwardStack.push(currentPage); 
    navigate(backStack.pop()); 
} 
function goForward() { 
    backStack.push(currentPage); 
    navigate(forwardStack.pop()); 
} 
+0

良い応答。ボタンの有効/無効を追加することで拡張できます。ナビゲーション機能内にこのコードを追加してみてください。 if(backStack.count == 0) backButton.Enabled = false; else backButton.Enabled = true; if(forwardStack.count == 0) forwardButton.Enabled = false; else forwardButton.Enabled = true; –

0

2つの数字、lastScreenInHistory,currentScreenが必要です。

  1. 両方を-1に初期化します。フォワードオンif(currentScreen > 0) --currentScreen;

  2. :背中に
    lastScreenInHistory = ++currentScreen; this.screenvisited[this.lastScreenInHistory]=data;

  3. :新しい画面到着で

  4. if(currentScreen < lastScreenInHistory) ++currentScreen;

  5. 各ボタンには、対応するif文の表現のときに限り有効にする必要があります真であります。戻る、進むの両方の後

あなたはインデックスcurrentScreenscreenvisitedから画面をロードする必要があります。

+0

currentindex 4の後に戻ると、インデックス4のデータはインデックス3のデータと同じですが、正しくないと思うので、フォワードデータが存在しないときにどのように前進できますか? – XMen

+0

私はデータが同じ理由は分かりません。戻ってくる必要がある場合は古いデータのコピーを作成できます。 – unkulunkulu

0

どのようにこの簡単な解決策について:

back(){ 
    currentscreenindex-=2; 
    var screen=screenvisited[currentscreenindex+1]; 
    // will go to this screen 
} 

「画面」がロードされるときに、それはcurrentscreenindex - 2 + 1その結果、1でcurrentscreenindexをインクリメントします - あなたが必要な正確に何。

関連する問題