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

时间:2014-09-24 10:52:28

标签: javascript dojo

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

我也有代码,我至少可以触发像“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之前版本的genereal)?

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

2 个答案:

答案 0 :(得分:0)

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

e.g

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);
        } 

答案 1 :(得分:0)

在这种情况下,我找到了如何执行与ondijitclick - 事件相关的方法的解决方案:

由于我已经拥有了domnode,因此可以访问domnode的id。使用此id,我可以使用dijit.byId(node.id)获取整个dijit-instance。有了这个,很容易调用连接到ondijitclick - 事件的dijit的功能。

在我的情况下,我有以下问题,因为事件代码需要一些事件参数,并在未设置时崩溃。所以我必须找出如何使用正确的属性值创建事件参数并将其传递给函数。但这是一个独立的问题,主题为here