1

我编写了 JS 函数,它必须根据数组中的值绑定它生成的按钮。但它给了我最后的价值。我读到我必须使用闭包,我做到了,但我仍然无法正确绑定它们!我仍然是一个初学者,我读过关于闭包的文章,我明白了,但仍然不知道我错过了什么

function addNewServices(newServicesArray){
    var j=0; var x;
    for (i in newServicesArray){
        var html='';

        html='<div style="width: 33%; float: leftt"><a href="#" data-role="button" data-icon="home" id="btn-'+newServicesArray[j].servicename+'" value="'+newServicesArray[j].servicename+'" class="ui-btn-up-c">'+newServicesArray[j].servicename+'</a></div>';
        $("#main-menu").append(html);


        $('#btn-'+newServicesArray[j].servicename).bind('click', function (){bindThis(j)});
        j++;
    }

    var bindThis = function( j ) {
        return function() {
            alert(j); // gives 2 always
            alert( newServicesArray[j].servicename ); 
        };
    };
}
4

3 回答 3

1

因为你有

function (){bindThis(j)}

当 j 的值为 2 时,稍后会调用它。

你只需要

bindThis(j)

用不同的值调用

于 2013-02-20T09:13:55.347 回答
1

您不必在循环中绑定单击...您可以通过$(this)在函数中获得单击的引用..

让它尽可能简单..

function addNewServices(newServicesArray){
   var j=0; 
   for (i in newServicesArray){
      var html='';

      html='<div style="width: 33%; float: left"><a href="#" data-role="button" data-icon="home" id="btn-'+newServicesArray[j].servicename+'" value="'+newServicesArray[j].servicename+'" class="ui-btn-up-c">'+newServicesArray[j].servicename+'</a></div>';

      $("#main-menu").append(html);


   }
}

$(function(){
  $(document).on('click','a[id^="btn-"]',function (){
      var $this = $(this);
      alert($this.attr('value')); 
  });
});
于 2013-02-20T09:16:30.423 回答
1

闭包只是函数从外部范围访问变量的方式。这里的关键词是变量——变量可能会改变,如果你之后访问它(点击),你将访问它的更高版本。

所以无论如何你需要存储jj按钮的关联。感谢 jQuery,bind方法已经为此提供了便利:它的第二个参数,eventData是一些将传递给事件处理函数的用户数据。

所以,改变这个:

(..).bind('click',function (){bindThis(j)});

对此:

(..).bind('click', j, bindThis);

...应该管用。请注意,我们不需要创建任何包装函数。我们只需将bindThis函数本身传递给bind,并告诉它在调用时bind将传递j给它。

(*) — 尚未测试

于 2013-02-20T09:20:47.430 回答