注册 登录
编程论坛 JavaScript论坛

click事件没有按预期返回字符串参数,而是将click事件作为参数回?

开司米 发布于 2010-01-25 23:20, 1161 次点击
问题描述:click事件没有按预期返回字符串参数,而是将click事件作为参数回
          传,这是为什么?应如何解决,哪怕给个提示也好,谢谢了!
/*
 * 方法描述:服务器接收到格式为:st1r#str2#str3#str4的字符串。js将其分
 *           割成数组。然后依次在一个div标签下建立数个span标签。span标
 *           签附于一个click事件侦听。目的是把参数字符串写入一个text标
 *           签。
 * @parameters responseText :服务器回执字符串。
 */   
function buildChoose(responseText){
       //DIV标签
       var content = _get("choosePanel");
       //字符串数组
       var columns = responseText.split("#");
       //字符串数组第一位是text的id
       var textObj = _get(columns[0]);
       //click事件响应方法
       var onclickFn = function(index){
          return function(index){
              alert("type:"+index.type);//此处alert输出内容为:type:click,即对象类型是click。但是原本传入的是一个数组下标啊
              //textObj.value = columns[parseInt(index)];
          }
       }
       //循环创建span标签,然后绑定侦听
       for(var i=1;i<columns.length;i++){
          var column = document.createElement("span");
          column.style.cssText="padding:2px;cursor:pointer;color:#4294EF;";
          column.innerHTML = columns[i];
          content.appendChild(column);
          addEventDf(column,"click",oncclickFn(i));//回调方法的参数数组下标。
       }
}

//绑定侦听。
function addEventDf(obj,evt,fn){
    if(obj.addEventListener){
          obj.addEventListener(evt,fn,false);
    }else if(obj.attachEvent){
          obj.attachEvent('on'+evt,fn);
    }
}


[ 本帖最后由 开司米 于 2010-1-25 23:21 编辑 ]
10 回复
#2
aspic2010-01-26 09:33
首先说下 你给的代码错误
addEventDf(column,"click",oncclickFn(i));//回调方法的参数数组下标。
#3
aspic2010-01-26 09:42
直接把onclickFn写到addEventDf(column,"click",oncclickFn(i));里面
#4
aspic2010-01-26 09:45
或者
程序代码:
var onclickFn = function(index){
    return function(){
        alert("type:"+index.type);//此处alert输出内容为:type:click,即对象类型是click。但是原本传入的是一个数组下标啊?
        //textObj.value = columns[parseInt(index)];
    }
}
#5
foktime2010-01-26 11:33
同aspic
如果想使用闭包中的变量,就应该把return function(index)中的index去掉。这样才能引用到外面的index
程序代码:
var onclickFn = function(index){
    return function(){
        alert("type:"+typeof(index));
        //textObj.value = columns[parseInt(index)];
    }
}
#6
开司米2010-01-26 15:59
正如aspic,foktime二位所说,确实是我的函数有问题。非常感谢!!小弟学艺不精,多谢,多谢!
#7
开司米2010-01-26 16:15
另外,弱弱的问一句,如果,我需要多个参数回传那该怎么办呢?return function(){}的参数还是不写吗?
#8
aspic2010-01-26 17:06
一样的
#9
foktime2010-01-26 17:37
程序代码:
var onclickFn = function(参数1,参数2,参数3,...参数N){
    return function(){
        alert("参数1:"+参数1+","参数2:"+参数2+","参数3:"+参数3+......N);
        //textObj.value = columns[parseInt(index)];
    }
}
return function(index){} 这么传什么也传不到 index无论是多少在这都相当于一个现场事件event
#10
开司米2010-01-26 22:05
万分感谢!虽然还有一些疑问(我之前事件绑定也用了闭包,但是return得时候还是赋予了参数)。不过,没关系,剩下的交给我研究吧。等我把手上这点事弄完,好好理理。越来越喜欢js了。谢谢大家!
#11
sunkaidong2010-01-26 23:23
参数覆盖了。外面参数进不来了
<html>
<head>
<script type="text/javascript" >



function buildChoose(responseText){
   
       //DIV标签
       var content =document.getElementById("choosePanel");

       //字符串数组
       var columns = responseText.split("#");
      
       //字符串数组第一位是text的id
       var textObj = document.getElementById(columns[0]);


             //click事件响应方法
       var onclickFn = function(index){
          return function(){
              //alert("type:"+index.type);//此处alert输出内容为:type:click,即对象类型是
click。但是原本传入的是一个数组下标啊?
              textObj.value = columns[parseInt(index)];
          }
       }
        

       //循环创建span标签,然后绑定侦听
       for(var i=1;i<columns.length;i++){
         
          var column = document.createElement("span");
         
          column.style.cssText="padding:2px;cursor:pointer;color:#4294EF;";
         
          column.innerText = columns[i];
           addEventDf(column,"click",onclickFn(i));//回调方法的参数数组下标。
          content.appendChild(column);

         
       }
}

//绑定侦听。
function addEventDf(obj,evt,fn){
    if(obj.addEventListener){
          obj.addEventListener(evt,fn,false);
    }else if(obj.attachEvent){
          obj.attachEvent('on'+evt,fn);
    }
}
</script>
</head>
<body>
<textArea  id="str1" > </textArea>
<div id="choosePanel"  ></div>
<button onclick="buildChoose('str1#str2#str3#str4')">你好</button>
</body>
</html>
1