【问题标题】:Is it possible to trigger dojo-specific events by code?是否可以通过代码触发特定于 dojo 的事件?
【发布时间】: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 元素的点击逻辑或允许我访问该对象的对象。

标签: javascript dojo


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2016-01-14
    • 2013-06-27
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多