问题标题可能不是很清楚甚至不准确。但是,这就是我想要做的。
我想要一个对象数组。每个对象都是一个按钮。我想将预定义函数绑定到每个按钮。代码示例为here。
目前,我正在使用eval(),但我知道它很慢,并且由于安全原因而被认为是不好的做法。并且它不起作用,因为eval()函数将立即执行并调用已声明的2个函数。
有人可以建议我实现目标的最佳方法是什么?
由于
答案 0 :(得分:3)
在这里修复了它:http://jsfiddle.net/tAZvz/2/
基本上FishBasketGordo关于存储函数的内容,但你必须使用jQuery的click
函数绑定事件,而不是分配给onclick
,因为它们是包装元素。
var func1 = function() { alert("Function 1 is called");}
var func2 = function() { alert("Function 2 is called");}
var myArray = [{id:"bt1", value:"+", func: func1},
{id:"bt2", value:"-", func: func2}];
$(function(){
for(var i=0;i<myArray.length;i++){
var button = $('<input type="button">');
button.attr('id',myArray[i].id).attr('value',myArray[i].value);
button.click(myArray[i].func);
$('#test').append(button);
}
});
答案 1 :(得分:1)
只需将该函数存储在数组中即可。
var myArray = [{id:"bt1", value:"+", func: func1 },
{id:"bt2", value:"-", func: func2 }];
然后设置click事件处理程序:
button.click(myArray[i].func);
答案 2 :(得分:1)
您可以将代码缩短为:
var func1 = function() { alert("Function 1 is called");}
var func2 = function() { alert("Function 2 is called");}
// changed property name ----------v
var myArray = [{id:"bt1", value:"+", click: func1},
{id:"bt2", value:"-", click: func2}];
$(function(){
$.each( myArray, function(i,v) {
$('<input>',$.extend({},v,{type:"button"})).appendTo('#test');
});
});
示例: http://jsfiddle.net/yLPsK/
我使用jQuery.each()
[docs]方法迭代你的数组。
然后我使用jQuery.extend()
[docs]方法使用您创建的对象(将func
更改为click
)以及使用type:"button"
的另一个对象扩展空对象info,并将结果作为第二个参数传递给jQuery()
[docs]方法。
如果您向阵列中的每个对象添加type:"button"
,则可以摆脱$.extend
。
var func1 = function() { alert("Function 1 is called");}
var func2 = function() { alert("Function 2 is called");}
// changed property name ----------v
var myArray = [{id:"bt1", value:"+", click: func1, type:"button"},
{id:"bt2", value:"-", click: func2, type:"button"}];
// added the "type" property -------------------^
$(function(){
$.each( myArray, function(i,v) {
$('<input>', v).appendTo('#test');
});
});