dojo onClick()事件和javascript作用域

dojo onClick()事件和javascript作用域,javascript,html,events,onclick,dojo,Javascript,Html,Events,Onclick,Dojo,我需要一些关于javascript中函数作用域的说明,以及dojox/mobile/Button的onClick()事件 正如文件所示: 我使用函数调用而不是内联编写来执行以下操作: html js 它不会工作,因为(据我所知)foo()是在另一个函数中定义的,因此它的作用域仅限于该函数 但是,如果我把foo()放在全局级别,比如: script(type="text/javascript"). require([ "dojo/on", "dijit/r

我需要一些关于javascript中函数作用域的说明,以及
dojox/mobile/Button
onClick()
事件

正如文件所示:

我使用函数调用而不是内联编写来执行以下操作:

html js 它不会工作,因为(据我所知)
foo()
是在另一个函数中定义的,因此它的作用域仅限于该函数

但是,如果我把
foo()
放在全局级别,比如:

script(type="text/javascript").
    require([
        "dojo/on",
        "dijit/registry",
        "dojo/domReady!"
    ], function (on, registry) {
    });
    function foo() {
        // do something
    }
我得到一个类型错误,因为
dojo
找不到处理程序:

TypeError:this.onClick不是函数

最后,使用标准html将引导处理程序工作:

button.mblSimpleDialogButton(data-dojo-type="dojox/mobile/Button" data-dojo-props="label: 'Procedi'" onClick="foo()" style="width:60%;")
但是因为
foo()
dojo
require的函数之外,我不能使用它的工具

正确的方法是什么

更新 我不知道这是否是最好的方法,但这是有效的:

html js
即使您可以以其他方式使用,
数据dojo道具也将在中使用

最常见的例子是:

define([
    "dojo/_base/declare",
    "dijit/_WidgetBase",
    "dijit/_TemplatedMixin",
    "dijit/_WidgetsInTemplateMixin"
], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin) {

    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
        templateString: '<button data-dojo-type="dojox/mobile/Button"' + 
            'data-dojo-props="onClick:myOnClick">My Button</button>',

        myOnClick: function(/*Event*/ evt) {
            console.log('Hello click');
        }
    });
});
定义([
“dojo/_base/declare”,
“dijit/_WidgetBase”,
“dijit/_TemplatedMixin”,
“dijit/_WidgetsInTemplateMixin”
],函数(declare,_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin){
返回declare([\u WidgetBase、\u TemplatedMixin、\u WidgetsInTemplateMixin]{
templateString:“我的按钮”,
myOnClick:函数(/*事件*/evt){
log('Hello click');
}
});
});
通过这种方式,
将成为您的
小部件
,您可以使用所需的任何
dojo
模块或小部件的任何
功能/属性

另一种方法是使用模块
dojo/on
,就像您的问题一样,但是请注意,函数的范围将是更改它,因此您需要使用
dojo/\u base/lang
或javascript的本机代码对其进行调整。阅读此文章了解更多信息


此外,我建议您阅读

即使您可以以其他方式使用,
数据dojo道具
也将在中使用

最常见的例子是:

define([
    "dojo/_base/declare",
    "dijit/_WidgetBase",
    "dijit/_TemplatedMixin",
    "dijit/_WidgetsInTemplateMixin"
], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin) {

    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
        templateString: '<button data-dojo-type="dojox/mobile/Button"' + 
            'data-dojo-props="onClick:myOnClick">My Button</button>',

        myOnClick: function(/*Event*/ evt) {
            console.log('Hello click');
        }
    });
});
定义([
“dojo/_base/declare”,
“dijit/_WidgetBase”,
“dijit/_TemplatedMixin”,
“dijit/_WidgetsInTemplateMixin”
],函数(declare,_WidgetBase,_TemplatedMixin,_WidgetsInTemplateMixin){
返回declare([\u WidgetBase、\u TemplatedMixin、\u WidgetsInTemplateMixin]{
templateString:“我的按钮”,
myOnClick:函数(/*事件*/evt){
log('Hello click');
}
});
});
通过这种方式,
将成为您的
小部件
,您可以使用所需的任何
dojo
模块或小部件的任何
功能/属性

另一种方法是使用模块
dojo/on
,就像您的问题一样,但是请注意,函数的范围将是更改它,因此您需要使用
dojo/\u base/lang
或javascript的本机代码对其进行调整。阅读此文章了解更多信息


另外,据我所知,我建议您阅读

,在创建自定义小部件时,您的代码和提供的链接非常有用。我只想在标准小部件上处理
onClick
事件。尝试将
onClick:myOnClick
添加到
数据dojo道具
并按上述方式定义处理程序会导致
引用错误:myOnClick not defined
可能我还不了解
dojo
基础。据我所知,您的代码和提供的链接在创建自定义小部件时非常有用。我只想在标准小部件上处理
onClick
事件。尝试将
onClick:myOnClick
添加到
datadojoprops
并按上述方式定义处理程序会导致
ReferenceError:myOnClick notdefined
可能我还不了解
dojo
基础知识。
button#myBtn.mblSimpleDialogButton(data-dojo-type="dojox/mobile/Button" data-dojo-props="label: 'Ok'" style="width:60%;")
var myBtn = dom.byId("myBtn");
on(myBtn, "click", function (e) {
    console.log("clicked!");
});
define([
    "dojo/_base/declare",
    "dijit/_WidgetBase",
    "dijit/_TemplatedMixin",
    "dijit/_WidgetsInTemplateMixin"
], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin) {

    return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
        templateString: '<button data-dojo-type="dojox/mobile/Button"' + 
            'data-dojo-props="onClick:myOnClick">My Button</button>',

        myOnClick: function(/*Event*/ evt) {
            console.log('Hello click');
        }
    });
});