【问题标题】:Does Dojo have an equivalent to jQuery.trigger()?Dojo 是否有等效于 jQuery.trigger() 的功能?
【发布时间】:2011-02-15 10:27:30
【问题描述】:

在 jQuery 中,你可以这样做:

$('#myElement').trigger('change');

我如何在 Dojo 中做到这一点?

【问题讨论】:

    标签: jquery events dojo


    【解决方案1】:

    dojo on.emit 方法 (1.7+) 可用于触发 dom 节点上的事件。从文档页面:

    require(["dojo/on"], function(on){
        // register event handler
        on(target, "mouseup", function(e){
            // handle event
        });
    
        // Send event
        on.emit(target, "mouseup", {
            bubbles: true,
            cancelable: true
        });
    });
    

    【讨论】:

    • 需要注意的是,该功能仅在1.7版本后可用。
    • 另外,第三个参数必须传递一个对象(即使是空的)。
    • 似乎无法让偶数的发送部分实际触发它。你能提供一个小提琴吗?
    • 好的,找出问题所在。 “目标”必须是 DOM 节点本身,而不是 dijit 实例。谢谢!
    【解决方案2】:

    我认为 Dojo 没有类似的功能,至少据我所知/可以找到。但是您可以使用如下代码来复制此功能:

    dojo.addOnLoad(function() {
    
        var button = dojo.byId("myButton");
        dojo.connect(button, "onclick", function() { alert("Clicked!"); });
    
        // IE does things differently
        if (dojo.isIE)
        {
            button.fireEvent("onclick");
        }
        else
        { // Not IE
            var event = document.createEvent("HTMLEvents");
            event.initEvent("click", false, true);
            console.debug(event);
            button.dispatchEvent(event);
        }
    });
    

    当然会更详细一点,但您可以使用它创建自己的 Dojo 版本的 trigger()。

    Try it out

    【讨论】:

    • 这种问题让我怀念 jQuery 的纯粹简单性.. :p
    • 是的,与自行车相比,汽车“荒谬而困难”
    【解决方案3】:

    对于某些 dijit 小部件和 djit 特定事件(例如 onChange ),您可以通过调用事件名称来事实上“触发”。

    <input id="numberBox" data-dojo-type="dijit.form.NumberTextBox" /> 
    
    <script>
        dojo.connect( dijit.byId('numberBox'), "onChange", function ( event ) { 
            dijit.byId('numberBox').set('value', 12345 );
        }); 
    
        dijit.byId('numberBox').onChange();
    </script>
    

    【讨论】:

      【解决方案4】:

      我最近偶然发现了 Dojo 的发布/订阅机制,我认为这是 jQuery 的绑定/触发器的对应物。

      链接:

      【讨论】:

        【解决方案5】:

        PlugD 有 dojo.trigger 和更多:https://github.com/phiggins42/plugd

        【讨论】:

          【解决方案6】:

          是的,您可以像这样在 Dojo 中的 DOM 元素上触发事件:

          dojo.byId("myElement").onChange();
          

          【讨论】:

          • 其实是这样。我只想说,道场并没有那么荒谬和困难。
          【解决方案7】:

          正如上一条评论中提到的,通过 dom API 将 dijit 作为纯 DOM 对象访问。

          require(["dojo/dom",
                  'dojo/on',
                  "dojo/domReady!"], function (dom, on) {
          
                  //Does not work
                  //registry.byId('myButton') 
                  //registry.byId('myButton').domNode
            
                  //Proper way
                  on.emit(dom.byId('myButton'), "click", {
                          bubbles: true,
                          cancelable: true
                  });
          
          });

          【讨论】:

            猜你喜欢
            • 2010-11-28
            • 2011-02-13
            • 1970-01-01
            • 2014-08-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-31
            相关资源
            最近更新 更多