【问题标题】:How to pass a 'constant' parameter in jquery如何在 jquery 中传递“常量”参数
【发布时间】:2011-09-02 14:06:09
【问题描述】:

我在 div 元素上附加了以下内容,它检测用户何时右键单击 div 并调用函数theFunction

$('#box_'+i).bind('mousedown',function(e){if(e.which==3)theFunction(e,i)});

代码在循环中运行(其中i 变量递增),因为页面上有多个需要右键单击功能的 div。但是,当调用 theFunction 时,它总是传递 i 的最后一个值,而不是完成 bind() 时的值。有没有办法让它保持不变,这样在循环运行时它不会改变之前的 div 的 i

【问题讨论】:

标签: javascript jquery for-loop


【解决方案1】:

您必须在循环内部的本地范围内捕获 i 的值:

// Start your loop
(function(i){
    $('#box_'+i).bind('mousedown', function(e){
        if (e.which==3) theFunction(e,i)
    });
})(i);
// end your loop

【讨论】:

    【解决方案2】:

    关闭解决方案都很好(它们工作得很好),但我想我会指出另一种方法来做到这一点。您还可以访问触发事件的对象并从对象的 id 中提取数字。这会像这样工作:

    $('#box_'+i).bind('mousedown',function(e){
        var matches = this.id.match(/_(\d+)$/);
        var num = parseInt(matches[1], 10);
        if(e.which == 3) theFunction(e, num);
    });
    

    或者如果你真的想要面向对象(并且使用 jQuery 的简洁功能),你可以将索引值保存为与对象关联的单独数据项,然后从那里检索它。

    $('#box_'+i).data("index", i).bind('mousedown',function(e){
        if(e.which == 3) theFunction(e, $(this).data("index"));
    });
    

    第二种方法的工作演示在这里:http://jsfiddle.net/jfriend00/wVDHw/

    【讨论】:

    • 关于您的第二个解决方案:确实不需要单独的方法调用。您可以将其全部包含在 bind 参数中:jsfiddle.net/wVDHw/2
    【解决方案3】:
    for(var i=0;i<100;i++)
        (function(i){
            $('#box_'+i).bind('mousedown',function(e){
                if(e.which==3)
                    theFunction(e,i);
             });
        })(i);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多