2011-10-06 87 views
0

我有一個導航,我將頁面加載到一個稱爲目標的div中。它運行良好,但有一點煩人的bug。jQuery加載兩次頁面,但爲什麼?

當我按下導航鏈接時,它隱藏當前內容並加載新內容,但隱藏新內容並再次顯示。在firebug中,我看到腳本對它正試圖加載的頁面發出兩個請求。但我不明白爲什麼它加載兩次?

繼承人我的jquery:

$(".nav").click(function(e){ 
     e.preventDefault(); 

     $(".footer").hide(0);  
     $('#target').html('<div class="content">Loding...</div>'); 

     $.get(this.href, function(data) { 

      $("#target").hide(0, function(){ 
       $("#sub_menu").fadeOut("fast");  
       $(".footer").show(0); 
       $(this).html(data).show(0); 
      }); 

     }); 


}); 

最好的問候!

+3

你確定你有點擊功能只加載**一次**嗎? – Neal

+0

你太對了!現在它可以工作,好像它不止一次加載。愚蠢的,但我猜是誠實的錯誤。 – Paparappa

回答

1

這是我在OP評論:

確保您的點擊代碼只加載ONCE

3

我的猜測是你有2個元素"nav"

嘗試alert($(".nav").length);檢查你得到了多少元素。

2

您的事件有可能從實際事件目標冒出來,並且處理程序綁定到祖先,在這種情況下,它會觸發兩次。

您可以停止從通過調用事件對象的stopPropagation方法發生:

$(".nav").click(function(e) { 
    e.stopPropagation(); 
    //etc... 
}); 
1

有幾個原因,這可能會發生,但也有一些不同的東西,你可以做些什麼來防止它擺在首位。首先,確保在通過AJAX加載內容時不重新應用處理程序。任何通過AJAX獲取的內容腳本都只適用於正在加載的內容。其次,如果您懷疑您可能正在重新應用處理程序或需要替換現有的處理程序,請在應用新處理程序之前刪除該事件的處理程序。第三,當你知道被調用的處理程序應該是在元素停止傳播上運行的唯一處理程序,並在適當的情況下阻止默認操作。最簡單的方法是從您的處理程序返回false

$('.nav').unbind('click').click(function() { 
    ... 
    return false; 
});