setAttribute('onclick',function (){})中的传值问题

时间:2022-08-08 19:57:04
IE中不支持给事件赋值的,但是FF支持
我写成setAttribute('onclick',“testvalue()”)没有任务反应
写成setAttribute('onclick',testvalue())会直接执行testvalue()函数,但是并不会给对象添加onclick事件
最后我写成setAttribute('onclick',function (){testvalue()})这样终于正确的添加onclick事件了,但是却遇到了一个传值的问题,我的代码如下:

       items2 = oDoc.selectNodes("//CLASSNAME/Table/pcl2_id");                  
       var itemsLength=items1.length;
       for(i=0;i<itemsLength;i++)                                                                 
        {          
          var newOption = document.createElement("li");
          newOption.setAttribute('onclick',function (){load2(items2[i].text);})     
        }


这句function (){load2(items2[i].text);}中的items2[i].text不能被赋值进去,不知各位大大是否有办法解决下,用其他方式也行,只要能给对象动态设置onclick事件就行,因为对象都是用createElement生成的,用getElementById的方式不现实,跪求解答,搞了一天了,郁闷死了!!!!

11 个解决方案

#1


newOption.setAttribute('onclick',function (){load2(items2[i].text);}) 

改成

newOption.setAttribute('onclick',function (v){return function(){load2(v);}}(items2[i].text)) 

#2


楼上的可以,也可以直接把值写到function(xxx)这样只有函数执行,就会把值传过去

#3


for(i=0;i<itemsLength;i++)                                                                 
        {         
(function(index){
          var newOption = document.createElement("li");
          newOption.setAttribute('onclick',function (){load2(items2[index].text);})
//或者
         newOption.onclick=function (){load2(items2[index].text);
})(i); 
               
        }
其实我没看明白你的问题。。。

#4



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <script>
  var array=[1,2,3,4,5,6];
  function testvalue(val)
{
   alert(val);
}


  function add(){
   for(i=0,len=array.length;i<len;i++)                                                                 
        {          
          var newOption = document.createElement("li");
  newOption.innerHTML=i+1;
          newOption.onclick=function (val){ return function(){testvalue(val);}}(array[i])
  
document.getElementById('div').appendChild(newOption);

        }
}

  </script>
 </HEAD>

 <BODY>
  <input type='button' value='click me' onclick='add()' />
<div id='div'></div>
 </BODY>
</HTML>

#5


newOption.setAttribute('onclick'

可以直接写

newOption.onclick

#6


setAttribute('onclick',testvalue())

=》

setAttribute('onclick',testvalue)  应设置函数句柄

#7


是你邦定事件的方法不对

function addEventListener(control, eventName, fn) {

if (window.attachEvent) {
control.attachEvent('on' + eventName, fn);
} else if (window.addEventListener) {
control.addEventListener(eventName, fn, false);
} else {
control['on' + eventName] = fn;
}
}

邦定的时候用addEventListener(newOption, 'click', function (){load2(items2[i].text);});

#8


闭包了

#9


很强悍,分有所值了,用1楼和4楼的方法搞定了!

#10


应该不是items2[index].text没有被赋值进去,而是items2 = oDoc.selectNodes("//CLASSNAME/Table/pcl2_id");
没有正确取得items2


看看我的测试代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <script>
function load() {
var test = document.getElementById("test");
var testNum = 1;

test.setAttribute("onclick", function() {alert(testNum);});
}

  </script>
 </HEAD>

 <BODY onload="load();">
  <div id="test">123</div>
 </BODY>
</HTML>

#11


4楼的还是没看懂
看来还是要多练习看书呀

#1


newOption.setAttribute('onclick',function (){load2(items2[i].text);}) 

改成

newOption.setAttribute('onclick',function (v){return function(){load2(v);}}(items2[i].text)) 

#2


楼上的可以,也可以直接把值写到function(xxx)这样只有函数执行,就会把值传过去

#3


for(i=0;i<itemsLength;i++)                                                                 
        {         
(function(index){
          var newOption = document.createElement("li");
          newOption.setAttribute('onclick',function (){load2(items2[index].text);})
//或者
         newOption.onclick=function (){load2(items2[index].text);
})(i); 
               
        }
其实我没看明白你的问题。。。

#4



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <script>
  var array=[1,2,3,4,5,6];
  function testvalue(val)
{
   alert(val);
}


  function add(){
   for(i=0,len=array.length;i<len;i++)                                                                 
        {          
          var newOption = document.createElement("li");
  newOption.innerHTML=i+1;
          newOption.onclick=function (val){ return function(){testvalue(val);}}(array[i])
  
document.getElementById('div').appendChild(newOption);

        }
}

  </script>
 </HEAD>

 <BODY>
  <input type='button' value='click me' onclick='add()' />
<div id='div'></div>
 </BODY>
</HTML>

#5


newOption.setAttribute('onclick'

可以直接写

newOption.onclick

#6


setAttribute('onclick',testvalue())

=》

setAttribute('onclick',testvalue)  应设置函数句柄

#7


是你邦定事件的方法不对

function addEventListener(control, eventName, fn) {

if (window.attachEvent) {
control.attachEvent('on' + eventName, fn);
} else if (window.addEventListener) {
control.addEventListener(eventName, fn, false);
} else {
control['on' + eventName] = fn;
}
}

邦定的时候用addEventListener(newOption, 'click', function (){load2(items2[i].text);});

#8


闭包了

#9


很强悍,分有所值了,用1楼和4楼的方法搞定了!

#10


应该不是items2[index].text没有被赋值进去,而是items2 = oDoc.selectNodes("//CLASSNAME/Table/pcl2_id");
没有正确取得items2


看看我的测试代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> New Document </TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <script>
function load() {
var test = document.getElementById("test");
var testNum = 1;

test.setAttribute("onclick", function() {alert(testNum);});
}

  </script>
 </HEAD>

 <BODY onload="load();">
  <div id="test">123</div>
 </BODY>
</HTML>

#11


4楼的还是没看懂
看来还是要多练习看书呀