Javascript dojo 1.6中onClick标记内的函数超出范围
我在Javascript dojo 1.6中onClick标记内的函数超出范围,javascript,foreach,onclick,dojo,dom-events,Javascript,Foreach,Onclick,Dojo,Dom Events,我在forEach循环中制作按钮,但当我尝试为按钮的onClick标记创建一个函数时,它会说this.foo()不是一个函数。代码如下: dojo.forEach(buttonIds, function(btn, i) { var button = new dijit.form.Button({ id: buttonIds[i]+'.'+widgetId, label: butt
forEach
循环中制作按钮,但当我尝试为按钮的onClick
标记创建一个函数时,它会说this.foo()
不是一个函数。代码如下:
dojo.forEach(buttonIds, function(btn, i) {
var button = new dijit.form.Button({
id: buttonIds[i]+'.'+widgetId,
label: buttonLabel[i],
onClick: function () {
dojo.hitch(this, this.foo());}
});
现在可能dojo.connect()
在这里更合适,但我不知道如何获得按钮ID作为第一个参数,因为如果我理解正确,那么connect看起来像dojo.connect(button.ID'onClick',this,foo())
。不幸的是,此语句也会导致相同的错误。这可能是一个微不足道的范围界定问题,但我对dojo非常陌生,因此任何帮助都将不胜感激
编辑:很抱歉,
dojo.connect()
错误是按钮未定义
我认为连接应该如下所示:
dojo.connect(dijit.byId(buttonIds[i]+'.'+widgetId), 'onclick', this.foo);
注意'onclick'中的小写字母'c',以及foo后面的no'()'
对于按钮构造函数中的onClick
参数,dojo.hitch
接受并返回在第一个参数范围内执行的函数,因此:
onClick:dojo.hitch(this, this.foo);
应该有用
您试图挂接函数的执行,而不是函数本身(注意函数名后面没有“();”)
dojo。forEach实际上接受三个参数():
forEach方法接受三(3)个参数:一个数组
迭代一个函数(或回调函数),以调用
数组(包括已分配索引之间的未分配索引,如图所示)
和一个可选对象,用作
调用回调
您的dojo.hitch
中的this
指向回调函数,添加this
作为第三个参数:
dojo.forEach(buttonIds, function(item, index, items) { /*callback*/ }, this);
// or alternatively
var self = this;
dojo.forEach(buttonIds, function(item, index, items) { /*use self instead of this here*/ });
我不确定你将要实现什么,但我猜:
dojo.require("dijit.form.Button");
dojo.ready(function() {
dojo.declare("Spam", null, {
constructor: function() {
this.buttonIds = ["button1", "button2", "button3"];
},
createButtons: function() {
dojo.forEach(this.buttonIds, function(item, index, items) {
var button = new dijit.form.Button({
id: item,
label: item
});
button.onClick = dojo.hitch(this, "foo", button);
button.placeAt(dojo.body());
}, this);
},
foo: function(widget, event) {
console.log(widget.id);
}
});
var spam = new Spam();
spam.createButtons();
});
在jsFiddle上查看它的实际操作:因此,如果我执行类似于onClick:this.foo
的操作,它似乎对一个按钮有效,但并没有对所有按钮实现onClick
。