2011-03-05 101 views
16

我想覆蓋錨標記的默認行爲,所以我可以加載到我的服務器上的網頁到現有的div,而不是一個新的選項卡或窗口。使用jquery覆蓋錨標記的默認行爲

到目前爲止,我有:

myContainer.click(function(){     
        event.preventDefault(); 
        $('a').click(function(){ 
         var link = $(this).attr('href'); 
         myContainer.load(link); 
        }); 
      }); 

在鉻我有兩次單擊鏈接它之前任何東西,在IE瀏覽器的FF它在所有不工作,並刷新新鏈接的頁面。

任何幫助,非常感謝。

回答

22

它不應該只是:

$('a').click(function(e) { 
    e.preventDefault(); 
    myContainer.load(this.href); 
}); 

您的代碼分配一個單擊處理在點擊處理程序中。因此,第一個點擊會將點擊處理程序附加到鏈接,並且點擊(在鏈接上)第二個將執行新的點擊處理程序。

看來你只需要一個點擊處理程序。如果鏈接動態添加,你可以使用.on()(的.live的繼任者和.delegate):

myContainer.on('click', 'a', function(e) { 
    e.preventDefault(); 
    myContainer.load(this.href); 
}); 

// or 

$(document).on('click', 'a', function(e) { 
    e.preventDefault(); 
    myContainer.load(this.href); 
}); 
+0

你絕對美!完美的人!順便說一句,現場和代表之間的區別是什麼? – Julio 2011-03-05 23:51:27

+2

@Julio:'live'向文檔根部添加一個事件處理程序(因此事件必須冒泡整個DOM樹),而'delegate'將事件處理程序添加到某個元素(在這種情況下爲'myContainer')。因此,在這個'delegate'示例中,只處理* myContainer'內的鏈接*上的事件,而with,點擊每個鏈接將被處理(儘管您也可以編寫'$('#myContainer a')。 live()'。但正如我所說的,使用'delegate',事件處理函數可以綁定到更接近原始元素的元素,您應該比'live'更喜歡'delegate'。 – 2011-03-05 23:55:55

+0

感謝man!非常棒的信息。缺少事件 - 小學生錯誤!我正在爲特定的瀏覽器應用程序編寫自定義選項卡插件,因此這是非常有用的信息。基本打開新選項卡或現有選項卡中的某些鏈接,管理選項卡,瀏覽器歷史記錄等 - 在這個問題的領域的任何提示意見? – Julio 2011-03-06 00:23:10

3

你忘了事件經過:

myContainer.click(function(event){ 
event.preventDefault(); 
$('a').click(function(){ var link = $(this).attr('href'); 
myContainer.load(link); 
}); 
}); 

嘗試重新排列:

myContainer.ready(function(){ 
    $('a').click(function(event){ 
    event.preventDefault(); 
    var link = $(this).attr('href'); 
    myContainer.load(link); 
    }); 
    }); 
+0

哎,感謝您的答覆,其固定在IE和FF的問題,但還是有什麼事情發生之前兩次單擊鏈接 – Julio 2011-03-05 23:40:22