Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript dojo 1.6中onClick标记内的函数超出范围_Javascript_Foreach_Onclick_Dojo_Dom Events - Fatal编程技术网

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