我正在尝试运行我放在变量上的一系列函数。
这是一个( demo )
代码:
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"));
})
答案 0 :(得分: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);
}
答案 1 :(得分:1)
function pass_me(x) {
alert(x);
}
var colors = ["yellow", "green", "blue"];
for(i = 0; i < colors.length; i++) {
pass_me(colors[i]);
}
答案 2 :(得分: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。像这样:
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]);
};
希望它对你有所帮助。
干杯
答案 3 :(得分:1)
在这里使用eval
可能是安全的,但这是另一个解决方案,我个人觉得它更清洁:
事件处理程序通过HTML属性绑定。大多数HTML属性值是相应DOM属性值的基础。在这种情况下,每个img
DOM元素都有一个属性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
事件的所有事件处理程序。
答案 4 :(得分:0)
你需要尝试
eval(colors[i]);
因为它是一个字符串而不是一个函数
答案 5 :(得分: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]();
}