2012-01-17 44 views
4

想象一下下面的標記:讓jQuery在讀取href之前等待href更改?

<a href="#link01">1</a> 
<a href="#link02">2</a> 

和:

$('a').click(function(){ 
    var href = $(location).attr('href'), 
    hrefLenght = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
}); 

現在,會發生什麼你點擊一個鏈接是jQuery的提醒hrefPage這是那裏你點擊了鏈接,不以前後如預期的那樣,在之後的。因此:

1)我位於http://www.example.com/#link01
2)單擊鏈接
3,結果)link01是呼應
3,預期)link02是呼應

任何想法如何解決這一問題?

編輯:我爲什麼使用位置而不是href?因爲我希望前面的代碼也可以在頁面加載href時沒有任何被單擊的情況下工作,我不認爲爲同一個進程編寫兩段代碼是一個好主意嗎?

+1

你trrying實施「頁面位置發生改變, 「處理程序與鏈接點擊處理程序。它不這樣工作。對於初學者來說,'click'會觸發_first_,但還有其他原因無法使用。只需要鏈接的「href」屬性。 – 2012-01-17 16:27:04

+0

編輯了這個問題。 – 2012-01-17 16:28:41

+0

不,鏈接的點擊處理程序不會因爲您加載頁面而奇蹟般地觸發。如果你想避免代碼重複,把邏輯封裝在一個函數中,並在多個處理程序中調用它。 – 2012-01-17 18:59:41

回答

2

你可以使用hashchange事件監測這些變化,而不是:

$('a').bind('hashchange',function(){ 
    var hval = location.hash.slice(1); // remove the leading # 
    alert(hval); 
}); 

要在頁面LO觸發hashchange廣告,所以它觸發對外部鏈接的散列或當你後退按鈕(而不是點擊一個鏈接,只有當)瀏覽,補充一點:

$(document).ready(function() { 
    $(window).trigger('hashchange'); 
}); 
+0

你應該包含使這項工作在IE中的回退。 – 2012-01-17 16:30:50

+0

它在IE8 +中工作 - 舊版本需要[插件](http://stackoverflow.com/q/680785/901048)。 – Blazemonger 2012-01-17 16:32:53

2

您的代碼中存在一個錯誤。而不是this關鍵字,您正在使用location它指向window.location

$('a').click(function(){ 
    var href = $(this).attr('href'), 
    hrefLenght = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
}); 
+0

我認爲他的意思是,雖然這是對問題的有效解決方案。 – 2012-01-17 16:26:09

0

爲什麼不使用您點擊的鏈接的href?它將具有href在更改之後所具有的價值。

$('a').click(function(){ 
    var href = this.href, 
    hrefLength = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
    // could also use: 
    // alert(this.href.split("#")[1]); 
}); 
0

您需要在運行javascript之前獲取url更改。你可以做到這一點的方法之一是簡單地把

window.location = $(this).attr('href'); 

在javascript代碼的頂部,迫使窗口導航操作你的JavaScript之前發生

例如:http://jsfiddle.net/btdqe/