0

我正在尝试运行我放在变量上的一系列函数。

这是一个(演示

代码:

function pass_me(x) {
    alert(x);        
};

var colors = new Array();
var colors = ["pass_me('yellow');", "pass_me('green');", "pass_me('blue');"]

for(var i = 0; i <= colors.length; i++) {
    window[colors[i]]();
}​

不幸的是,我无法让它运行。知道我的代码有什么问题吗?

谢谢


函数数组变量背后的故事是因为我从动态元素中复制了它。这样它只会运行页面中已有的功能。因此,如果 pass_me("red") 不存在,它将不会运行。

例子:

<img src="img/something.jpg" ondblclick="pass_me("yellow")" />
<img src="img/something.jpg" ondblclick="pass_me("green")" />
<img src="img/something.jpg" ondblclick="pass_me("blue")" />

然后我只使用:

jQuery("td img").each(function(){
colors.push(jQuery(this).attr("ondblclick"));
})
4

6 回答 6

1

如果你想执行一个 javascript 字符串,你必须使用 eval 来告诉 javascript 将你的字符串解析成 javascript。这通常不是编写 javascript 的最佳方式。

为了避免使用 eval,我建议这样做:

function pass_me(x) {
    alert(x);        
};

var colors = ["yellow", "green", "blue"];

for(var i = 0; i <= colors.length; i++) {
    pass_me(colors[i]);
}​

或者,如果你真的想把函数放在数组中,这样你就可以在数组中有不同的函数,你可以这样做:

function pass_me(x) {
    alert(x);        
};

var colors = [{fn:pass_me, color: "yellow"}, {fn:pass_me, color: "green"}, {fn:pass_me, color: "blue"}];

for(var i = 0; i <= colors.length; i++) {
    colors[i].fn(colors[i].color);
}​
于 2012-11-17T04:43:40.173 回答
1

演示

function pass_me(x) {
    alert(x);        
}

var colors = ["yellow", "green", "blue"];

for(i = 0; i < colors.length; i++) {
    pass_me(colors[i]);
}
于 2012-11-17T04:49:52.503 回答
1

将数组成员更改为如下处理程序:

function pass_me(x) {
    alert(x);        
};

var colors = [{ handler: pass_me, args: ['yellow'] }, { handler: pass_me, args: ['green'] }, { handler: pass_me, args: ['blue'] }];

for(var i = 0; i < colors.length; i++) {
    colors[i].handler.apply(this, colors[i].args);
};

这样,您可以在同一个数组中拥有多个处理程序,每个处理程序具有不同的参数。或者在调用之前初始化成员,因为成员的数据类型是字符串,而不是函数。像这样:

function pass_me(x) {
    alert(x);        
};

var colors = ["pass_me('yellow')", "pass_me('green')", "pass_me('blue')"];

for(var i = 0; i < colors.length; i++) {
    eval(colors[i]);
};

希望它可以帮助你。

干杯

于 2012-11-17T05:00:14.377 回答
1

在这里使用可能是安全的eval,但这是另一种解决方案,我个人觉得它更干净一些:

事件处理程序通过 HTML 属性绑定。大多数 HTML 属性值是相应 DOM 属性值的基础。在这种情况下,每个imgDOM 元素都有一个属性ondblclick,其函数体是 HTML 属性的值。

意味着 HTML 等同于:

imgElement.ondblclick = function() {
    pass_me('yellow');
};

因此,如果您想“收集”这些函数,您只需获取对事件处理程序的引用:

var handlers = jQuery("td img").map(function(){
    return this.ondblclick;
}).get();

稍后给他们打电话:

for(var i = 0, l = handlers.length; i < l; i++) {
    handlers[i]();
}

但是,如果您只想执行所有处理程序而不实际单击图像,则可以在它们上触发事件:

jQuery("td img").trigger('dblclick');

这将执行该事件的所有事件处理程序dbclick

于 2012-11-17T07:13:08.063 回答
0

你需要尝试

eval(colors[i]);

因为它是字符串而不是函数

于 2012-11-17T04:41:40.053 回答
0

也许您正在寻找匿名函数:

function pass_me(x) {
    alert(x);        
}

var colors = [
    function(){ return pass_me('yellow'); }, 
    function(){ return pass_me('green'); },
    function(){ return pass_me('blue'); }
];

for(var i = 0; i < colors.length; i++){
    colors[i]();
}
于 2012-11-17T04:46:55.383 回答