Dojo 是不是有等效于 jQuery.trigger() 的功能?

Posted

技术标签:

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

在 jQuery 中,你可以这样做:

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

我如何在 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 的绑定/触发器的对应物。

链接:

Events with Dojo (v1.6) dojo.publish reference guide

【讨论】:

【参考方案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
        );

);

【讨论】:

以上是关于Dojo 是不是有等效于 jQuery.trigger() 的功能?的主要内容,如果未能解决你的问题,请参考以下文章

列表框控件的 Dojo/HTML 等效项

在 jQuery 中的元素 this 的 Dojo 中等效吗?

Vim 是不是有等效于 \X 来匹配 Unicode“字素簇”?

msbuild 中是不是有等效于 make -k 的选项?

R中是不是有等效于“count if”函数的功能?

Pyspark 中是不是有等效于 SQL 的 MSCK REPAIR TABLE 的方法