2013-10-12 115 views
1

我試圖更新跳轉鏈接href點擊。我這樣設置初始跳轉鏈接的東西:點擊更新跳轉鏈接href點擊

<a href="#2" id="next">Next</a> 

然後我用一些JavaScript來更新的onclick在href:

var jump = this.href.match(/\#\d+$/)[0]; 
var num = parseInt(jump.substr(1, jump.length), 10); 
var newNum = num + 1; 

document.getElementById('next').href = '#' + num; 

出於某種原因,當我點擊跳轉鏈接第一次,它將我帶到#3(而不是預期的#2)。如果我將HTML中的href更改爲#1,它將使我到#2,這似乎違反直覺。我想我的問題是,在href被JavaScript更新後(看起來是)跳躍發生了嗎?我怎麼才能讓它先跳,然後更新href?

(另外,我使用addEventListener()觸發點擊)。

+0

你能告訴我什麼是「跳」?以及導致跳轉到新位置的代碼部分在哪裏? –

+0

Opps。錯字。 'var link'應該是'var jump'。更新。跳轉本身應該只是一個標準的跳轉鏈接。 – Phil

回答

1
var jump = this.href.match(/\#\d+$/)[0]; 
var num = parseInt(jump.substr(1, jump.length), 10); 
var newNum = num + 1; 

setTimeout(function() { 
    document.getElementById('next').href = '#' + newNum; 
}); 

小重構:

var num = parseInt(this.href.split('#').pop(), 10); 
var a = this; 

setTimeout(function() { 
    a.href = '#' + (num + 1); 
}); 
+0

這似乎已經成功了。謝謝。我想這延遲了href的更新? – Phil

+0

是的,正好:) –

+2

是的,更明確地包括1ms參數。執行1ms的setTimeout將清除當前的調用堆棧。在這種情況下,等到當前調用堆棧清除還包括等待直到「跳轉」結束。這裏有一個很好的閱讀:http://ejohn.org/blog/accuracy-of-javascript-time/ – Vinay

0

您遇到的問題很有可能是因爲跳轉發生在事件觸發前,正如您猜測的那樣,並且這導致this成爲新鏈接,您可以使用console.log(this)來檢查它,此處的建議案件將是對事件使用event.preventDefault();,這不會使鏈接工作,您的代碼將首先運行。 和公正,以確保,你在你的事件偵聽器添加預防這樣的:

something.addEventListener("click", function(event) { 
    event.preventDefault();}, false)