js的attachEvent传递的参数总是最后一个,求解决办法

[code="html"]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">

About




123明细信息
456明细信息
789明细信息
ss

function initHrefColor(objs){ var objs=document.getElementsByTagName("a"); var obj=null; outer:for(var i=0;i<objs.length;i++){ obj=objs[i]; obj.attachEvent("onclick",function (){aaa(obj);}); }} initHrefColor(); function aaa(obj){ alert(obj.innerText); }

[/code]

不论点击哪个超链接alert(obj.innerText);获取到的值总是最后一个的值“789明细信息”。求解决方法,使能获取到相对应超链接的值。

4个回答

1、var obj=null;

outer:for(var i=0;i<objs.length;i++){

obj=objs[i];

obj.attachEvent("onclick",function (){aaa(obj);});

}}

aaa(obj);//obj=objs数组最后一个,所以这样肯定不对;

2、attachEvent不支持Mozilla系列,需要addEventListener
[url]http://www.cnblogs.com/poorpan/archive/2011/08/10/2134039.html[/url]

3、我们通过event传递,然后通过如下代码拿到目标对象
var src = event.srcElement;
if(!src) {
src = event.target;
}
[url]http://codex.wordpress.org.cn/HTML%E5%85%B3%E4%BA%8EEvent%E5%AF%B9%E8%B1%A1[/url]

4、可执行代码:
[code="java"]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">

About








123明细信息
456明细信息
789明细信息
ss

function initHrefColor(){ var objs=document.getElementsByTagName("a"); var obj=null; outer:for(var i=0;i<objs.length;i++){ obj=objs[i]; //非Mozilla系列 if(obj.attachEvent) { obj.attachEvent("onclick",aaa); } else { obj.addEventListener("click",aaa); } }} function aaa(event){ var src = event.srcElement; if(!src) { src = event.target; } alert(src.innerText); } initHrefColor();


[/code]

lysvanilla
lysvanilla 谢谢 非常感谢
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 嗯 是的。
大约 8 年之前 回复
spx443812507
spx443812507 <script type="text/javascript" language="javascript"> function initHrefColor(objs) { var objs = document.getElementsByTagName("a"); var obj = null; for (var i = 0; i < objs.length; i++) { (function (e) { if (e.attachEvent) { e.attachEvent("onclick", function () { aaa(e); }); } else { e.addEventListener("click", function () { aaa(e); }); } })(objs[i]) } } function aaa(obj) { alert(obj.innerText); } window.onload = function () { initHrefColor(); } </script> 我觉得这样是最符合楼主思路的
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 即 <tr><a href="#" onClick="alert('123');" > 会被覆盖掉
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 而且 obj.onclick=function(){alert(this.innerText)}; 是覆盖性的 之后的绑定覆盖之前的。
大约 8 年之前 回复
jinnianshilongnian
jinnianshilongnian 最简单的办法 是直接传objs[i]即可 楼主的代码也是有问题的。attachEvent Mozilla浏览器不支持
大约 8 年之前 回复
spx443812507
spx443812507 你这样做貌似改变了楼主的思路,使用闭包不就解决了么。。。
大约 8 年之前 回复

function initHrefColor(objs){
var objs=document.getElementsByTagName("a");
for(var i=0;i<objs.length;i++){
var obj = objs[i];
obj.onclick = function(){
aaa(this);
}
}
}

initHrefColor();

function aaa(obj){
alert(obj.innerText);
}

lysvanilla
lysvanilla 谢谢 我明白你的意思了
大约 8 年之前 回复
lysvanilla
lysvanilla 当时我只注意了你是aaa(this); 因为我当时测过这个传this,是没有成功的 没有注意到你把代码的attachEvent改了 所以不好意思 所以还需要请教attachEvent的话怎么处理 谢谢
大约 8 年之前 回复
lysvanilla
lysvanilla 你这个不是给超链接增加一个方法调用,这是替换掉了。用attachEvent就会是undefined
大约 8 年之前 回复
works001
works001 再给你一个写法 <title>About</title> <meta http-equiv=Content-Type content="text/html; charset=utf8"> </head> <body > <table width="100%" border="1"> <tr><a href="#" onClick="alert('123');" >123明细信息</a></tr> <tr><a href="#" onClick="alert('456');" >456明细信息</a></tr> <tr><a href="#" onClick="alert('789');" >789明细信息</a></tr> <tr><text>ss</text></tr> <table> </body> <script language="javascript"> function initHrefColor(objs){ var objs=document.getElementsByTagName("a"); for(var i=0;i<objs.length;i++){ var obj = objs[i]; obj.onclick = (function(){ var objInner = obj; return function(){ alert(objInner.innerText); } })(); } } initHrefColor(); </script> </html> 原理采用闭包的形式
大约 8 年之前 回复
works001
works001 我自己都alert出值了
大约 8 年之前 回复
works001
works001 代码是我亲自验证的
大约 8 年之前 回复
lysvanilla
lysvanilla 请验证自己的答案后再回答,谢谢
大约 8 年之前 回复
lysvanilla
lysvanilla 这个试过了,alert的结果是undefined。
大约 8 年之前 回复

你没有搞清楚, 推荐你去看一下, 变量作用域是怎么样工作的
搜索了一篇文章:http://www.cnblogs.com/terryglp/articles/1776695.html

var obj=null;

outer:for(var i=0;i<objs.length;i++){

obj=objs[i];

obj.attachEvent("onclick",function (){aaa(obj);});

}}

这里function (){aaa(obj);}, 引用了obj这个变量, 每次循环, 其实obj的指向都在变,
循环结果, obj就指向objs数组里最后一个元素了

这时, 在点击触发aaa(obj), alert的东西就会一直是最后一个a

推荐babydeed的方法,

这是常见的JS中的作用域问题,使用闭包就可以解决,另外jinnianshilongnian 指出的浏览器兼容问题也需要注意一下。还有,在js编写规范里,提到将js写到head里是最好的,
但是你这里var objs=document.getElementsByTagName("a"); 如果写在head里肯定拿不到,所以要加上window.onload去执行。或者引用jquery的$(function(){}),这两个的区别你可以百度一下,另外推荐一个网址,帮助你大体上了解一下js
http://bonsaiden.github.com/JavaScript-Garden/zh/
[code="java"] function initHrefColor(objs) {
var objs = document.getElementsByTagName("a");
var obj = null;
for (var i = 0; i < objs.length; i++) {
(function (e) {
e.attachEvent("onclick", function () { aaa(e); });
})(objs[i])
}
}
function aaa(obj) {
alert(obj.innerText);
}
initHrefColor();
[/code]
第一次回答问题希望对你有帮助

lysvanilla
lysvanilla 谢谢 很有帮助
大约 8 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐