将循环变量作为参数传递给元素函数

时间:2011-09-07 22:01:34

标签: javascript html

原谅标题,不知道该放什么。

我有一些代码:

var links=document.getElementsByTagName('a');
for(var i=0;i<links.length;i++){
    var cur=links[i];
    cur.onmouseover=function(){alert(i);};
}

我记得以前看过类似的东西,但我不知道如何找到它。如果有人提出这样的问题,我会感到非常惊讶,并希望得到这个链接。

编辑:问题是它总是在循环结束后警告“我”是什么。如果有两个链接,则它们都会发出警报2。

编辑:我记得在这里看到它:http://nathansjslessons.appspot.com/。很少有课程,我建议任何人都没有这样做。

3 个答案:

答案 0 :(得分:3)

试试这个:

var links=document.getElementsByTagName('a'); 
for(var i=0;i<links.length;i++){     
    var cur=links[i];     
    cur.onmouseover=function(a){
        return function(){
            alert(a);
        }
    }(i); 
} 

答案 1 :(得分:0)

您实际上可以使用Array.forEach

var links=document.getElementsByTagName('a'); 
[].forEach.call(links, function(cur, i) {
    cur.onmouseover = function() { alert(i); };
})

诀窍是使用.call(),将links作为this参数传递。

您需要add .forEach() for older browsers本身不支持它。

答案 2 :(得分:0)

这是一种更可重复使用的解决方案。记住3 r减少重复使用回收;)它溢出到现实生活中。看看哪个是最快的优化乐趣! http://jsperf.com/speed-test-for-links-script

var links       = document.getElementsByTagName('a'); 
var linksLength = document.getElementsByTagName('a').length //cache the length means quicker for loop

var addMouseOver = function(i){
    links[i].onmouseover=function(){
        alert(i);
    };
} //extract the function

for(var i=0;i<linksLength;i++){     
    addMouseOver(i);
}