2011-07-18 66 views
3

我正在循环链接列表。我可以正确获取标题属性,并希望它显示onclick。当页面被加载并且当我点击一个链接时,所有链接标题都会一个一个地提醒。我究竟做错了什么?Javascript for loop和alert

function prepareShowElement() { 
var nav = document.getElementById('nav'); 
var links = nav.getElementsByTagName('a'); 
for (var i = 0; i < links.length; i++) { 
    links[i].onclick = alert(links[i].title); 
    } 
} 
+3

这是你的第一语言不是吗?用另一种语言学习编程会更好。 Javascript会教你任何其他语言都不会的东西,但每当你拿起它时,它就有能力在脚下射击你。我了解编程专家,他们在Javascript中做了非常错误的事情,因为他们不了解它。 – jcolebrand

+1

@jcolebrand:是的,当他需要在网站上显示提醒时,那些其他语言会对他有很大帮助...... – Thilo

+1

这确实是我的第一语言。好玩的东西! – Squadrons

回答

6

你是什么做的实际上是运行警报功能。 封闭在一个匿名函数整个事情将只运行它被点击时它

for (var i = 0; i < links.length; i++) { 
    links[i].onclick = function() { 
     alert(this.title); 
     } 
    } 
+0

这将无法正常工作,因为警报运行时链接或i的值都不会有效。请参阅PaulPRO的答案,以正确的方式来做到这一点。 – jfriend00

+0

我修复了错误,我有@Thilo – Ibu

+0

谢谢'这个'为我工作。 – Squadrons

2

您将onclick分配给alert(links [i] .title)的返回值;这没有任何意义,因为onclick应该是一个函数。

你想,而不是什么是somethig像onclick = function(){ alert('Hi'); };

由于您使用变量i在循环中,您需要创建它的本地副本 onclick = function(){ alert(links[i].title); };只是将使用外部范围我和你所有的链接都会提醒同样的信息。

要解决这个问题,你需要编写本地化我一个函数,并返回具体到每个环节自己的onclick一个新功能:

onclick = (function(i){ return function(e){ alert(links[i].title); }; })(i);

最终结果:

function prepareShowElement() { 
var nav = document.getElementById('nav'); 
var links = nav.getElementsByTagName('a'); 
for (var i = 0; i < links.length; i++) { 
    links[i].onclick = (function(i){ return function(e){ alert(links[i].title); }; })(i); 
    } 
}  
+0

+1,如果你解释为什么额外的关闭是必要的,以捕获我。 – Thilo

+3

只需从'this.title'获得标题,而不是使用更复杂的闭包。 – jfriend00

+1

实际上这是真的!链接[i]是点击触发的元素,所以如果你根本不使用'i',甚至不需要关闭。那么我更喜欢伊布的解决方案。 – Paulpro

2

您可以使用jQuery。单击时显示链接的标题。

$("#nav a").click(function() { 
    var title = $(this).attr('title'); 
    alert(title); 
}); 
+0

不是OP要求的。 – jfriend00

+0

+1,而不是OP所要求的,但微不足道; **编辑**:-1不使用'var' ... -1声明代码做了它不会做的事......我只是要编辑它以使其正确... – ninjagecko

+1

@ jfriendOO:我明白他想要点击链接显示链接的标题。我匆忙地输入'href'而不是'title'。 @ninjagecko:谢谢你。 – xyz

-2

您需要更改.onclick的事件侦听相同:

function prepareShowElement() { 
    var nav = document.getElementById('nav'); 
    var links = nav.getElementsByTagName('a'); 
    for (var i = 0; i < links.length; i++) { 
    links[i].addEventListener('click',function() { 
     alert(links[i].title); 
    },false); 
    } 
} 
+0

令人惊讶的是,有多少人误解了当onclick处理程序被调用时链接的值和我不再有效,因此这不起作用。而且,没有要求更改为addEventListener(这在IE中也不起作用)。 – jfriend00

1
links.forEach(function(link) { 
    link.onclick = function(event) { 
     alert(link.title); 
    }; 
} 

另外请注意,您的原始解决方案遇到这个问题: JavaScript closure inside loops – simple practical example

通过传递我们的迭代变量进入关闭,我们会保留它。如果我们用一个for循环写上面,它应该是这样的:

// machinery needed to get the same effect as above 
for (var i = 0; i < links.length; i++) { 
    (function(link){ 
     link.onclick = function(event) { 
      alert(link.title); 
     } 
    })(links[i]) 
} 

// machinery needed to get the same effect as above (version 2) 
for (var i = 0; i < links.length; i++) { 
    (function(i){ 
     links[i].onclick = function(event) { 
      alert(links[i].title); 
     } 
    })(i) 
}