2012-04-18 20 views
0

私は、このコードをajax経由で各ページを読み込んでフォールバックする主要サイトのナビゲーションに使用しています。jQuery ajax navigation with ajax navigation

$(function() { 
    var newHash = '', 
     $contentWrap = $("#content-wrap"); 
    $("nav").on("click", "a", function() { 
     window.location.hash = $(this).attr("href"); 
     return false; 
    }); 
    $(window).on('hashchange', function() { 
     newHash = window.location.hash.substring(1); 
     $contentWrap.load(newHash + " #content"); 
    }); 
    $(window).trigger('hashchange'); 
});​ 

これが正常に動作しますが、私はまた、#コンテンツラップ内でのナビゲーションのためにいくつかのより多くのボタンでロードしていますabout.html例えば別のページからコンテンツをロードするとき。

so#content-wrapにはデータボックスとナビゲーション用のボタンが追加されました。新しいナビゲーションをクリックすると、データボックスに新しいデータを読み込む必要があります。

まず、私はちょうど上記のスクリプトをコピーしてみましたが、新しいアンカーでは矛盾します。

私は何らかのif文を必要としますが、if(function!== undefined)のようなものを調べましたが、何をすべきか分かりません。

私は自分自身を説明しているか分かりませんが、私はそれを説明するのが混乱していますが、基本的には上記のコードを基本的に同じコードを以下のように組み合わせています。

$(function() { 
    var newHash = '', 
     $contentWrap = $("#content-wrap"), 
     $aboutWrap = $("#a-wrap"); 
    $("#content-wrap").on("click", "a", function() { 
     window.location.hash = $(this).attr("href"); 
     return false; 
    }); 
    $(window).on('hashchange', function() { 
     newHash = window.location.hash.substring(1); 
     $aboutWrap.load(newHash + " #a-content"); 
    }); 
    $(window).trigger('hashchange'); 
});​ 

更新:種類のビットを動作しますが、

$(function() { 

var newHash = '', 
     $nav = $("nav a"), 
     $boxBtn = '', 
     $aboutWrap = '', 
     $contentWrap = $("#content-wrap"); 

$("nav").on("click", "a", function() { 

    $(this).addClass("nav-click"); 

    window.location.hash = $(this).attr("href"); 

    return false; 
}); 

$contentWrap.on("click", "a", function() { 

    $(this).addClass("btn-click"); 

    window.location.hash = $(this).attr("href"); 

    return false; 
}); 

$(window).on('hashchange', function() { 

    var  $aboutWrap = $("#a-wrap"), 
       $boxBtn = $("div.btn a"); 

    newHash = window.location.hash.substring(1); 


    if ($nav.hasClass("nav-click")){ 

    $contentWrap.load(newHash + " #content"); 
    $nav.removeClass("nav-click"); 
    }; 

    if ($boxBtn.hasClass("btn-click")){ 

     $aboutWrap.load(newHash + " #a-content"); 
     $boxBtn.removeClass("btn-click"); 
    }; 
}); 

$(window).trigger('hashchange'); 


}); /*/end*/ 

答えて

0

私の計画を変更し、私は基本的にほとんどの場合、問題は、競合する要素のIDのである、同様の問題がありました。 DOMでは、IDは1回だけ使用できます。ラッパーのようなユニークな要素に対してのみclassNamesとIDを使用することで回避できます。

+0

こんにちは、返信ありがとうございます。私はそれが時々問題になることは知っていますが、私はそれがここに当てはまるとは思わない。私は '$(ウィンドウ).on(' hashchange '、function(){'が2回呼び出されていることが問題だと思いますが、これを防ぐためにifステートメントを配置する方法はわかりません。 – thom

+0

手動でハッシュを変更することもできますが、リンクを介してハッシュを変更したときに変数を設定し、その変数を関数内でチェックすることもできます。 clickeventハンドラ – Opi

+0

こんにちは、私はそのアイデアで遊んでいましたが、私はそれがうまく動作する(上に掲載されました)が、バックのボタンは動作しません。私は本当に時間がないので、毎回メインコンテンツ全体をロードするだけでなく、非常に非効率的であれば、フォールバックのために少しシンプルになります。 – thom