2010-01-21 29 views
1

初學者Javascript問題在這裏。在函數中使用循環值的問題

我想創建一個函數,查找給定div中的所有鏈接,併爲每個鏈接設置一個onclick事件。我能得到正確的鏈接HREF中,但是當我嘗試在onclick功能使用它們,使用Javascript似乎只能用找到的最後一個值:

IE 我有這些鏈接

#purpose

#未來

#faq常見

當我使用的onclick功能,每一個環節都被報告爲#faq常見的鏈接。

下面的代碼:

function prepareLinks() { 
var nav = document.getElementById('navigation'); 
var links = nav.getElementsByTagName ('a'); 
for (var i = 0; i<links.length; i++) { 
    var linkRef = links[i].getAttribute('href').split("#")[1]; 
    links[i].onclick = function() { 
     var popUp = "You clicked the " +linkRef +" link"; 
     alert (popUp); 
    } 
} 

}

回答

6

這裏有一個closure創作。外部變量linkRef保存在內部onclick函數中。試試這種方式:

clickFunction() { 
    var popUp = "You clicked the " + this.href.split("#")[1] +" link"; 
    // this should mean current clicked element 
    alert (popUp); 
} 

for (var i = 0; i<links.length; i++) { 
    links[i].onclick = clickFunction; 
} 
+0

那是主要功能嗎? – YsoL8 2010-01-21 11:54:03

+0

for循環將在主函數中,並且clickFunction ...不能肯定地說。嘗試進出。 如果您使用「in」,則可以將其轉換爲主要功能。 – kirilloid 2010-01-21 12:04:27

1

這是一個範圍界定問題。當onclick事件觸發時,會評估「您點擊了」+ linkRef +「link」的表達式,但此時linkRef的值是多少?

0

您正試圖爲每個鏈接附加一個單獨的onClick處理程序,但是您意外地附加了相同的處理程序。

您可以通過使用新的功能()構造函數產生一個新的功能,每次爲

links[i].onclick = new Function("","alert('You clicked the '"+linkRef+"' link');"); 

詳情請參閱http://tadhg.com/wp/2006/12/12/using-new-function-in-javascript/

但是,看看你是否可以擁有一個處理程序通常會更好。有趣的是,當你到達事件處理程序時,「this」關鍵字指向事件的生成器。所以你可以讓你的原始代碼引用this.getAttribute(「href」)。太多的處理程序會讓你的JavaScript事件處理變慢。