2013-06-08 18 views
5

コンテンツ/ディレクトリにある別のページのコンテンツを読み込むためにjquery $ .ajaxを使用してWebサイトを開発しています。また、バックボタン、リロードなどを有効にするためにハッシュタグを使用しています。AJAXバックボタンメニューの問題

しかし、アクティブなアイテムを持つメインメニューがあります。メインメニュー項目の1つのページの間を移動すると、アクティブになります。次に、連絡先などのメインメニュー項目の1つをクリックします。したがって、連絡先メニュー項目がアクティブになります。ブラウザの戻るボタンをクリックすると、アクティブなメニュー項目は変更されません。

アクティブなメインメニュー項目の状態を覚えておく方法はありますか?メインメニューはコンテナページにあります。

ありがとうございました!

$(function(){ 

     $('.menu a') 
      .bind('click',function(e) { 
       e.preventDefault(); 
       $('#content').html('Извините, страница не существует или находится в разработке!'); 
       $('.menu a').each(function() {$(this).removeClass('activelink');}); 
       location.hash=$(this).attr('href').match(/(([a-z]*)\W)*/)[2]; 

       $(this).addClass('activelink'); 
       return false; 
      }); 

     $('#content').on('click','a',function(e) { 
      if (!($(this).hasClass('address') || $(this).hasClass('zoom'))){ 
      e.preventDefault(); 
      $('#content').html('Извините, страница не существует или находится в разработке!'); 
      location.hash=$(this).attr('href').match(/(([a-z]*)\W)*/)[2]; 
      return false; 
      } 
      else { 
       if ($(this).hasClass('address')) { 
       alert('Вы покидаете сайт The House Of Events. Возвращайтесь к нам еще!'); 
       } 
      } 
     }); 

    function hashChange(){ 
     var page=location.hash.slice(1); 
     if (page!=""){ 
      $.ajax({ 
        type: "GET", 
        url: "content/" + page + ".html #sub-content", 
        success: function(data, status) { 
         $('#content').html(data); 
         }, 
        error: function fail() { 
         $('#content').html('Error'); 
         } 
       }); 
     } 
    } 

    if ("onhashchange" in window){ 
     $(window).on('hashchange',hashChange).trigger('hashchange'); 
    } else { 
     var lastHash=''; 
     setInterval(function(){ 
      if (lastHash!=location.hash) 
       hashChange(); 
      lastHash=location.hash; 
     },100); 
    } 
}); 
+0

メニュー項目をアクティブにする方法を確認するためのポストコード – Nagarjun

+0

追加しましたコード –

+0

をチェックアウト 'history.pushState()' –

答えて

0

ハッシュタグを使う場合は小さなトリックを作成できます。

編集これら:

$('#content').on('click','a',function(e) { 
    if(!($(this).hasClass('address') || $(this).hasClass('zoom'))){ 
    e.preventDefault(); 
    $('#content').html('Извините, страница не существует или находится в разработке!'); 
    var page=location.hash.slice(1).split('/')[0] + '/' + $(this).attr('href').match(/(([a-z]*)\W)*/)[2]; 
    location.hash=page; 
    return false; 
    } else { 
    if ($(this).hasClass('address')) { 
     alert('Вы покидаете сайт The House Of Events. Возвращайтесь к нам еще!'); 
    } 
    } 
}); 

function hashChange(){ 
    var page=location.hash.slice(1).split('/')[1]; 
    if(page==='undefined'){ 
    page=location.hash.slice(1).split('/')[0]; 
    } 
    if(page!=""){ 
    $.ajax({ 
     type: "GET", 
     url: "content/" + page + ".html #sub-content", 
     success: function(data, status) { $('#content').html(data); }, 
     error: function fail() { $('#content').html('Error'); } 
    }); 
    } 
} 

また、HTML5履歴APIを使用することができます。

onpopstate

window.onpopstate = function(e){ 
    if(e.state){ 
    $('.menu a.activelink).removeClass('activelink') 
    $('.menu #'+JSON.stringify(e.state.menu).replace(/"/gi,'')).addClass('activelink'); 
    var url=window.location.pathname; 
    $.ajax({ ... }) 
    } 
} 

を使用してバックボタンでものを変更するには次に(場所のハッシュを削除)クリックイベントの下

var active=$('.menu a.active').attr('id'); // or var active=$('.menu a.active').text(); 
history.pushState({menu: active}, "Our events", "events.html"); 

これを入れて、あなたは多くのことを追加した場合必須愚かな道をfinaliメニュー項目にクラスを追加してチェックしてください。.hasClass()

+0

ありがとうございますが、問題はメインメニューにないページに関連しています。たとえば、私のルートは:私はメインメニューアイテム "私たちのイベント"をクリックした - >私はページ "結婚式"へのコンテンツページのリンクをクリックし、それをクリックし、それは私のコンテンツのdivに読み込まれた。しかし、このページは "私たちのイベント"のメンバーでもありますので、メインメニューの "連絡先"をクリックしてからブラウザの「戻る」ボタンをクリックしたときよりもアクティブにする必要がありますが、結婚式.htmlをメインメニューに表示するので、項目「連絡先」はまだ有効です。そして私は、 "連絡先"の代わりに "私たちのイベント"という項目をアクティブにする必要があります。 –

+0

それからあなたはそれを行うための2つの方法があります。最初に、子リンクの名前であるメニューをクラスに追加します。 2番目のオプションはHTML5履歴APIを使用することです。これを使用すると、 'stateObj'ハンドラを使用して、アクティブにするメニューの名前を追加できます(JSONを使用する必要があります)。そしてその情報を 'JSON.stringify(e.state.name_of_the_handler)'と呼んでデータを取得します。 – Nergal

+0

または、yourdomain.com/#/weddings/our_eventsを使用して、 'location.hash.slice(1).split("/")[1]'を使用することができます。もしあなたがハッシュタグを使いたいなら、それはおそらく最良の解決策です。 – Nergal