【问题标题】:Dijit ComboButton / DropDownMenu onclick misunderstandingDijit ComboButton/DropDownMenu onclick 误区
【发布时间】:2012-07-03 14:07:35
【问题描述】:

我刚刚开始玩 Dojo。我只是想在单击 Dijit ComboButton 的 DropDownMenu 中的项目时显示一个对话框。我尝试使用 dojo.connect 将 onclick 事件与一个函数关联起来,该函数只会显示一个包含项目中的文本的对话框,但没有成功。

我设法让它以一种可怕的方式工作。现在所有的工作实际上都是手动写入 onclick 属性的。我显然在这里误解了一些东西。这是我目前拥有的:

JS:

    require(["dijit/form/Button", "dijit/form/FilteringSelect", "dijit/DropDownMenu", "dijit/MenuItem"]);

    //if the following is defined inside dojo.ready, nothing happens
    function getmail(text)
    {
         alert('No mail from '+text);
    }


    dojo.ready(function(){ 
        //the following does nothing:
        dojo.connect(dojo.query(".dijitMenuItemLabel"), "onclick", function(evt) {
            console.log("mail item clicked");
            alert('Blah');
            //dojo.stopEvent(evt);
        });
    });

HTML:

<form method="POST">

    <div data-dojo-type="dijit.form.ComboButton" id="getmail">

        <span>Get All Mail</span>

        <div data-dojo-type="dijit.DropDownMenu">

            <div data-dojo-type="dijit.MenuItem" 
                data-dojo-props="onClick:function(){getmail(dojo.trim(dojo.query('.dijitMenuItemLabel', this.domNode)[0].innerHTML))}">
                Yahoo</div> 

            <div data-dojo-type="dijit.MenuItem">Google</div>

        </div>

    </div>

</form>

我显然对 Dojo 有什么误解?

(或者我犯了简单的 JavaScript 错误)


JSFiddle

【问题讨论】:

    标签: javascript dojo dom-events


    【解决方案1】:

    你应该可以用类似的东西来做到这一点

    var myButton = dijit.byId('getmail');
    myButton.on('click', function(){ alert('clicked') });
    

    我的猜测是您在获取按钮时混淆了 dojo.byId 和 dijit.byId - 当您连接小写的“onclick”但小部件触发驼峰式“onClick”事件时,常规 DOM 节点工作(区别是因为 dijits触发一些键盘事件,以方便访问)。

    但是,对于较新版本的 Dojo,最好远离 dojo.connect,而只使用我展示的更简单的“.on”API。


    啊,在我忘记之前,您似乎也忘记了运行 Dojo 解析器(或将 parseOnLoad 设置为 true),因此从未创建按钮。你能提供一个关于 JSFiddle 的完全可执行的例子吗?

    【讨论】:

    • parseOnLoad 设置为 true。您提供的代码确实可以按您所说的那样工作,但是我要做的是检测单击下拉菜单中的项目的时间。真正的问题是为什么getmail 函数必须在dojo.ready 之外,为什么所有工作都必须硬编码到onclick 属性而不是在getmail() 中只存在一次? JSFiddle 添加到问题中
    • @AdamLynch:嗯,您当然可以从 onclick 内部调用 getmail 或将 getmail 作为 onclick 处理程序传递。您确定这不是一个简单的范围界定问题吗?请记住,Javascript 变量(和函数)仅在定义它们的函数内部可见。
    • this 之类的东西不起作用。我尝试了很多类似的实现
    • @AdamLynch: onClick:function(){getmail(this)} 仅在 getmail 是全局函数时才有效。由于您在另一个函数中定义了 getmail,所以情况并非如此。
    • 我怎样才能像你说的那样将 getmail 作为处理程序传递?
    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多