如何使用动态名称调用jQuery函数?

时间:2015-11-28 22:26:57

标签: javascript jquery dynamic

我无法相信我一直无法找到解决这个问题的方法。它看起来像一个非常“常规”的问题,其解决方案会乱扔垃圾网!

我从数据库查询中返回了这些数组:

var ids = ['12', '15', '40'];
var actions = ['hide', 'show', 'fadeIn'];

我想循环遍历数组并对DOM执行适当的操作,如下所示:

for(var i=0; i < ids.length; i++){
    $('#row_'+ids[i]).actions[i]();
}

现在你明白了。实际上我没想到$('#row_'+ids[i]).actions[i]();按原样工作。我尝试过像

这样的事情
$('#row_'+ids[i]).effect(actions[i]);

无济于事。我相信eval()应该可以工作,并且(绝望地)甚至尝试过,但无法获得正确的字符串以便它发挥作用。

在Stack Overflow的其他地方,我遇到了使用window全局解决的类似问题,例如:

var fn = 'hideSomething';
window.fn();//where hideSomething was a defined function.

但是这个定义在jQuery,而不是window

所以我们来了!

2 个答案:

答案 0 :(得分:4)

您需要使用[varhere]按变量名访问属性/方法。由于您的媒体资源名称位于actions[i],因此您可以执行此操作:

$('#row_'+ids[i])[actions[i]]();

或者,通过一个稍微简单的方案来完全遵循正在发生的事情:

var method = actions[i];
$('#row_'+ids[i])[method]();

当提前知道属性名称时,您可以使用点语法obj.prop。如果它在变量中并且未提前知道,则使用obj[prop]语法。由于方法只是一个属性,因此同样适用于jQuery方法。

for(var i=0; i < ids.length; i++){
    $('#row_'+ids[i])[actions[i]]();
}

答案 1 :(得分:1)

使用方括号表示法来访问该属性:

for (var i = 0; i < ids.length; i++) {
  $('#row_' + ids[i])[actions[i]]();
}

Example Here

请参阅:Property accessors in JS (MDN)