小弟我在学jquery绑定事件时遇到点麻烦,恳请高手指点下。
代码如下
 
 var ApageTotal; //总页数
  var Atotal ; //记录数
....
function setPageUp(pNum){
   $("#p_b_total").html('共'+Atotal +'条记录  第'+pNum+'/'+ApageTotal+'页')
   $("#p_b_list li").remove();
    if(pNum!==1){ 
 var starStr = $('<li ><a href="void(0)">首页</a></li>').bind("click",function(){getPage("accounts",1);return false;});
 $("#p_b_list").append(starStr);
}
 var upStr = $('<li><a href="void(0)">上一页</a></li>').bind("click",function(){getPage("accounts",(pNum)-1<1?1:(pNum)-1);return false;});
 $("#p_b_list").append(upStr); 

 var cycleNum =pNum+5; // 每次显示5页
 cycleNum = (cycleNum >ApageTotal)?ApageTotal:cycleNum; //如果循环的页数值大于总页数。则显示当前页到最后一页
   ///////有问题的地方在这里
 for(var i = pNum;i<cycleNum;i++){
   
var listStr =(i==pNum)?$('<li class="wzpdang"><a href="void(0)" class="'+i+'">'+i+'</a></li>').bind("click",function(){getPage("accounts",i);return false;}):$('<li><a href="void(0)"  class="'+i+'">'+i+'</a></li>').bind("click",function(){getPage("accounts",i);return false;});

$("#p_b_list").append(listStr); 
  }
  ////////////往下的代码调试无异常
    var downStr = $('<li><a href="void(0)">下一页</a></li>').bind("click",function(){getPage("accounts",(pNum)+1>ApageTotal?ApageTotal:(pNum)+1);return false;});
 $("#p_b_list").append(downStr); 
    if(pNum!==ApageTotal){ 
 var endStr = $('<li><a href="void(0)">末页</a></li>').bind("click",function(){getPage("accounts",ApageTotal);return false;});
 $("#p_b_list").append(endStr);
}
}
function getPage(type,pageNum){这里是获取分页的记录}原谅我不会贴本地图片
初始显示
上一页1 2 3 4 5下一页 末页
当我点1,即第一页是,传递的参数是 i=1,即应该执行getPage("accounts",1),可实际上执行的是getPage("accounts",6),我觉得执行的是for循环后,绑定的最后一个匿名函数。
请高手指点下,该怎么传参数呢?
谢谢

解决方案 »

  1.   

    补充一下 在循环时 参数 i的取值,赋值都是正常的。
        问题出在所有的click绑定的都是 在i循环到最大值 即i = pNum +5时的匿名函数
        
      

  2.   

    自己解决了,用function handler(event) {
      alert(event.data.foo);
    }
    $("p").bind("click", {foo: "bar"}, handler)
    这种方式来传参数,新加个函数来接受点击时取到的参数,再调用getPage(type,pageNum)就行了
     function annousDate(event){
    ...
     for(var i = pNum;i<cycleNum;i++){   var listStr =(i==pNum)?$('<li class="wzpdang"><a href="#" class="'+i+'">'+i+'</a></li>').bind("click", {account: "accounts",num:i}, annousDate,function(){return false;}):$('<li><a href="#" class="'+i+'">'+i+'</a></li>').bind("click", {account: "accounts",num:i}, annousDate,function(){return false;});
        $("#p_b_list").append(listStr); 
      }
    ....
    var pageNum = event.data.num;
    var type =event.data.account;
    getPage(type,pageNum);
    }  
      

  3.   

    当我点1,即第一页是,传递的参数是 i=1,即应该执行getPage("accounts",1),可实际上执行的是getPage("accounts",6),我觉得执行的是for循环后,绑定的最后一个匿名函数。   对于为什么会出现这样的问题,我还是没弄明白,如果那位有好的意见,可以给我留言,谢谢
      

  4.   

    在jquery 1.4.1 中文参考手册上看到的,bind 的说明中关于传参数的部分,贴上来传递事件数据 可选的第二个参数data通常用的很少。如果提供了这个参数,那么我们就能把一些附加信息传递给事件处理函数了。这个参数有个很好的用处,就是处理闭包带来的问题。比如我们有两个事件处理函数要指向同一个内部变量: 
    var message = 'Spoon!';
    $('#foo').bind('click', function() {
      alert(message);
    });
    message = 'Not in the face!';
    $('#bar').bind('click', function() {
      alert(message);
    });由于这两个函数在他们各自的环境中都有message,所以触发时显示的消息都是 Not in the face! 。变量值被改变了。为了回避这个问题,我们可以把message变量作为data参数传递进去: 
    var message = 'Spoon!';
    $('#foo').bind('click', {msg: message}, function(event) {
      alert(event.data.msg);
    });
    message = 'Not in the face!';
    $('#bar').bind('click', {msg: message}, function(event) {
      alert(event.data.msg);
    });这时在函数内部不再直接指向这个变量了;取而代之的是按值传递给了data参数,他能保持绑定事件时的值。第一个函数现在会显示Spoon!,而第二个则显示Not in the face! 注意,如果这个对象按引用传递给了函数,那么将会使情况变得极其复杂。