是否可以通过代码触发特定于 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 或特定于平台的)可用于收听用户设备时间的任何变化?