我正在尝试创建一个Web应用程序,允许用户定义自定义JavaScript函数,然后在其用户界面中添加一个按钮,以完成该功能。
以下是代码示例
var customCommands = {
command1: {
text: 'Hello Console',
cFunctionRun: function() {
console.log('hello Console!');
}
},
command2: {
text: 'Hello World',
cFunctionRun: function() {
alert('hello World!');
}
}
}
然后我写了一个小函数,它循环并构建按钮并将它们添加到用户界面。问题是当我将元素附加到用户界面而不是单击按钮时没有任何作用...
这是我尝试过的方法之一
for (var cmd in customCommands) {
command = customCommands[cmd];
button = $('<button/>').html(command.text).on('click',
function(){
console.log(command.text);
command.cFunctionRun();
}
);
}
buttonContainer.append(button);
现在我的循环构建一切都很好甚至.on('click')
都能正常工作,但是它总是会显示已添加命令的文本吗?
这里有http://jsfiddle.net/nbnEg/来说明会发生什么。
答案 0 :(得分:2)
当您实际单击时,命令变量指向最后一个命令(因为整个循环已经运行)。您应该维护每个按钮的数据状态,告诉它调用哪个命令。你应该这样做。
for(var i in customCommands) {
if(customCommands.hasOwnProperty(i)){ //this is a pretty important check
var command = customCommands[i];
button = $('<button/>').html(command.text).data("command_name", command).on('click', function(){
console.log($(this).data("command_name").text);
$(this).data("command_name").cFunctionRun();
});
$("body").append(button);
}
}
答案 1 :(得分:1)
您只需要通过函数传递参数,您应该尝试this
答案 2 :(得分:0)
这是一个(缺失)关闭问题。事件处理程序将在循环的最后一次迭代中保留对command的值的引用。要解决此问题,您可以使用立即调用的函数创建新范围:
for(var cmd in customCommands) {
(function(command){
button = $('<button/>').html(command.text).on('click',
function(){
console.log(command.text);
command.cFunctionRun();
}
);
buttonContainer.append(button);
}(customCommands[cmd]));
}
答案 3 :(得分:0)
由于button
应该唯一(没有理由创建重复项),我将按钮id
设置为customCommands的name
(本例中为command1和command2)。这个例子很容易适应使用任何相关属性(data- *,name等)。
在click
上创建一个document
事件监听器,只要您按下button
一个id
。然后调用与给定$(document).on("click", "button", function(){
customCommands[this.id].cFunctionRun();
});
for(var command in customCommands){
var button = $('<button id="' + command +'"/>').html(customCommands[command].text);
$("body").append(button);
}
关联的函数。
{{1}}
<强> EXAMPLE 强>