是否可以通过代码触发特定于 dojo 的事件?

Posted

技术标签:

【中文标题】是否可以通过代码触发特定于 dojo 的事件?【英文标题】:Is it possible to trigger dojo-specific events by code? 【发布时间】:2014-09-24 10:52:27 【问题描述】:

我在一个基于 dojo 的大型 web 项目中遇到了一个小问题(早于 dojo 1.7 的版本,据我所知是 1.3)。我想通过代码触发特定事件,但不知道如何实现。这是一个名为ondijitclick 的事件,它通过html 中的data-dojo-attach-event-attribute 进行注册。我也不能只调用此事件触发的方法,因为我只能在需要此功能的位置访问 domnode(或者我只是不知道如何访问属于此 domnode 的对象)。

我也有代码,我至少可以触发像“onclick”这样的常见事件:

        if (document.createEventObject)
            // IE
            var evt = document.createEventObject();
            node.fireEvent('onclick', evt);
        
        else
            // other browsers
            var evt = document.createEvent("HTMLEvents");
            evt.initEvent('click', true, true );
            node.dispatchEvent(evt);
        

我可以输入ondijitclick 事件,但什么都不会发生,也不会出现任何错误。 Visual Studio(带有 ReSharper)本身告诉我这个事件无法解决。因此,我认为不会触发任何事件,并且由于事件类型未知而忽略了命令。

最后整个问题是:是否存在通过 dojo 1.3 的代码(或 dojo 1.7 之前的版本的通用代码)触发此类事件的方法?

编辑:澄清需要针对 dojo 1.3 的解决方案

【问题讨论】:

我猜它应该是dijitclick 没有 on 前缀。由于您知道有一个 ondijitclick 事件,因此会有一个代码将该事件附加到 dijit。你能找出 ondijitclick 是如何连接到 dijit/dom 节点的吗? 事件通过 html 模板文件中的属性附加。单击 ui 元素时,整个事情都会正确执行。所以一切正常。我只想通过“应用程序”中另一个位置的代码触发相同的操作。我无法通过javascript代码直接访问这个ui元素,只能使用dojo.query并获取domnode。不知何故,我找不到继承 ui 元素的点击逻辑或允许我访问该对象的对象。 【参考方案1】:

Module dojo/Evented 是一个可以用作 mixin 或基类的类,用于在类中添加 on()emit() 方法,用于监听事件和发出事件。

例如

define(["dojo/_base/declare","dojo/Evented", "dojo/Stateful"
        ], function(declare, Evented, Stateful)
                var EventedStateful = declare([Evented, Stateful], ...);
                var instance = new EventedStateful();
                instance.on("open", function(event)
                  //... do something with event
                );

            instance.emit("open", name:"some event", ...);

在您的示例中,您有一个小部件连接到ondijitclick 而不是onclick(用于可访问性),请参阅dijit._OnDijitClickMixin。您可以使用"dojo/on" 中的emit() 方法,emit() 方法提供了一种标准化的事件调度机制。

对于旧版本的 dojo 测试。

        var element= dojo.byId("myElement");
        // IE does things differently
        if (dojo.isIE)
        
            element.fireEvent("ondijitclick");
        
        else
         // Not IE
            var event = document.createEvent("HTMLEvents");
            event.initEvent("ondijitclick", false, true);
            console.debug(event);
            element.dispatchEvent(event);
         

【讨论】:

感谢您的回答,但很遗憾您的解决方案似乎是基于dojo 1.7(或更高版本)的。该项目使用比 dojo 1.7 更早的版本(如前所述),所以我需要一个解决 dojo 旧方式的解决方案......(当前使用的版本是 1.3)。目前无法升级。【参考方案2】:

我找到了在这种情况下如何执行连接到ondijitclick-event 的方法的解决方案:

由于我已经有了 domnode,所以可以访问 domnode 的 id。有了这个 id,我可以使用dijit.byId(node.id) 获得整个 dijit 实例。有了它,就很容易调用连接到ondijitclick-event的dijit函数了。

就我而言,我遇到了以下问题,因为事件代码需要一些事件参数,并且在未设置它们时会崩溃。所以我必须找出如何创建和传递具有正确属性值的事件参数给函数。但这是一个单独的问题,主题为here

【讨论】:

以上是关于是否可以通过代码触发特定于 dojo 的事件?的主要内容,如果未能解决你的问题,请参考以下文章

是否有可用的事件(在 xamarin 或特定于平台的)可用于收听用户设备时间的任何变化?

Flask入门之触发器,事件,数据迁移

ORM - 特定于用于 .NET 的 SQL Server 2008+

编译器是否特定于操作系统?

onEnded 事件未在 dojo 对话框中触发

dojo.dijit.Button 触发 onclick 事件两次