2013-07-21 5 views
12

私はバックボタンを使ってajaxを動作させようとしており、何か中心のものが欠けています。前のページの状態はどこに保存されていますか?Ajaxと戻るボタン。ハッシュは変更されますが、以前のページの状態はどこに保存されていますか?

CASE 1:

クリックして "私は赤にします"。 ajaxイベントが発生し、ページが赤色に変わります。ハッシュ= #red

「make me yellow」をクリックします。 ajaxイベントが発生し、ページが黄色に変わります。ハッシュ=#イエロー

戻るボタンをクリックします。ハッシュは#redに戻っています。しかし、私はまた、ページを赤くしたい。まだ黄色です。

CASE 2:

クリックして "私は赤にします"。 ajaxイベントが発生し、ページが赤色に変わります。ハッシュ= #red

[他のサイトに移動]をクリックします。それはGoogleに行く。

戻るボタンをクリックします。私たちはsite、hash = #redに戻っていますが、ページも赤くしたいと思っています! AJAXを使用している場合

<!DOCTYPE html> 
<html> 
<style> 
    .red{background:red} 
    .yellow{background:yellow} 
</style> 
<head> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
    $(function(){ 
     $('.ajax_thing').click(function(){ 
      location.hash=$(this).attr('action_type'); 
      return false 
     }) 
     var originalTitle=document.title 
     function hashChange(){ 
      var page=location.hash.slice(1) 
      if (page!=""){ 
       $('#content').load(page+".html #sub-content") 
       document.title=originalTitle+' – '+page 
      } 
     } 
     if ("onhashchange" in window){ // cool browser 
      $(window).on('hashchange',hashChange).trigger('hashchange') 
     }else{ // lame browser 
      var lastHash='' 
      setInterval(function(){ 
       if (lastHash!=location.hash) 
        hashChange() 
       lastHash=location.hash 
      },100) 
     } 
    }) 

    </script> 
</head> 
<body> 
<menu> 
     <li><a class="ajax_thing" id = "red_action" action_type="red">Make me red</a></li> 
     <li><a class="ajax_thing" id = "yellow_action" action_type="yellow">Make me yellow</a></li> 
</menu> 
     <li><a href = "http://www.google.com">Go to other site</a></li> 
</body> 
</html> 
<script> 

$("#red_action").click(function(e) { 
    // ajax here. on success: 
    $("body").removeClass("yellow"); 
    $("body").addClass("red"); 
}) 

$("#yellow_action").click(function(e) { 
    // ajax here. on success: 
    $("body").removeClass("red"); 
    $("body").addClass("yellow"); 
}) 

</script> 
+1

あなたはhttps://github.com/browserstate/history.js/ – gmaliar

+0

を参照してください。私は「ajaxリクエスト」も表示されず、セミコロンもたくさん忘れています –

+1

セミコロンがなくてはならないように機能しますOK。私は他の場所からコードの大部分を手に入れました。実際のAjaxリクエストをしないのは、これをそのままここで皆のために働かせたいからです。しかし、私はdomを変更します、これはajaxリクエストが行うものです。実際のAjaxリクエストは、魔法のように動作させるものだと思いますか? – user984003

答えて

5

それは次にonpopstateイベントのための機能テストを作成し、必要に応じてコンテンツを更新history.pushState

を使用して手動で歴史を更新することが重要です。

https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Manipulating_the_browser_history

+2

ようこそスタックオーバーフロー。あなたの答えの中のリンクを要約してください。そうすれば、リンクが古くなっても答えは完全に役に立たないわけではありません。 – michaelb958

+1

これは、人々が推薦しているもの、またはすべてのブラウザについて、history.jsと思われるようです。 (実際には、変更が発生した場合にページをリロードするだけで、ハッシュによる変更を追跡しながら、簡単に何かをやることになりました) – user984003

12

のではなく、あなたのURLを駆動するために、あなたはJavaScriptを使用して、あなたのURLがあなたのJavaScriptをドライブしてみましょう。 window.onhashchangeイベントハンドラにすべての作業をさせてください。他のすべてはハッシュを変更するだけです。

あなたもちょうどハッシュへのURLを設定し、リンクのハンドラをクリックする必要はありません。そして、

<a href="#red">Red</a> 

、あなたのhashchangeハンドラは残りの面倒を見る:

function hashChange() { 
    var page = location.hash.slice(1); 
    if (page) { 
     $('#content').load(page+".html #sub-content"); 
     document.title = originalTitle + ' – ' + page; 
     switch (page) { 
      // page specific functionality goes here 
      case "red": 
      case "yellow": 
       $("body").removeClass("red yellow").addClass(page); 
       break; 
     } 
    } 
} 

ハッシュを変更する理由は、ページに戻ってURLに基​​づいて同じ状態をロードできるようにする場合だけです。だから、あなたはすでにURLをJavaScriptを駆動させるという要求を持っていますね。それ以外の理由であなたはハッシュを変更していますか?クリックハンドラの外で、そしてhashchangeイベントへの機能の移動は、事を単純化するだけです。

+0

それでもコンテンツはロードされません。また、ajaxはhref駆動型ではありません。実際のコードでは、aaaxを呼び出してタグを追加するボタンです。 – user984003

+0

@ user984003 - わかりません。なぜコンテンツが読み込まれないのですか?リンクの代わりにボタンを使用するのはなぜ重要なのですか? – gilly3

+0

あなたの答えを理解する方法、私は具体的にどのような状態に戻すためにコードを書く必要があります。背景を赤に設定します。しかし、ユーザーはタグを追加したり、評価を変更したり、アイテムをajax経由でカートに追加したりしたかもしれません。私はこの状態を一気に得る方法が必要です。 pushStateやhistory.jsは、人々が推薦しているようです。 – user984003

関連する問題