如何覆盖 dojo 的 domReady

How to override dojo's domReady

我想覆盖 dijit._CssStateMixin 的 domReady() 方法。 有什么方法可以覆盖它而不是更改 Dojo 中的侦听器机制。

我尝试简单地覆盖 _cssMouseEvent() 方法 javascript,但它仍然会从 domReady() 调用 dijit 的 _cssMouseEvent()。

我试过以下方法:

 dojoConfig = {
        map: {
            'dijit/_CssStateMixin': {
                    'dojo/domReady': 'app/noop'
            }
    }
}; 

我添加了 'app' 文件夹,然后在其中添加了 'noop.js'。 noop.js里面什么都没有:

    define([], function () {
    return function () {};
});

即使在这之后我也可以看到 dijit.js 的 _CssStateMaxin domReady() 从 listener.apply 被调用(下面粘贴的代码片段)

var addStopImmediate = function(listener){
        return function(event){
            if(!event.immediatelyStopped){// check to make sure it hasn't been stopped immediately
                event.stopImmediatePropagation = stopImmediatePropagation;
                return listener.apply(this, arguments);
            }
        };
    }

如果您的最终目标是防止 dijit/_CssStateMixin 中的 domReady 回调来自 运行ning,您最简单的选择可能是将 dojo/domReady 重新映射到不同的通过 dijit/_CssStateMixin.

加载时根本不调用回调的模块

注意: 剥离这些处理程序可能会对继承 _CssStateMixin 的 Dijit 小部件产生不利的视觉影响,因为它可能会阻碍 Dijit 的应用 CSS 类 与悬停和焦点相关。但是,如果您担心 _CssStateMixin 会影响性能,那么至少值得尝试确认或否认您的怀疑。

首先我们必须创建一个简单的模块,其中 returns 一个什么都不做的函数,稍后我们将在 dijit/_CssStateMixin 加载时替换 dojo/domReady,这样它仍然可以调用 domReady 但它不会执行它传递的回调。

为简单起见,我假设您已经有一个可以轻松添加模块的自定义包;对于这个例子,我假设它叫做 app。让我们创建 app/noop:

define([], function () {
    return function () {};
});

现在让我们将加载程序配置为映射 app/noop 代替 dojo/domReady,特别是在由 dijit/_CssStateMixin 加载时:

var dojoConfig = {
    ...,
    map: {
            'dijit/_CssStateMixin': {
                    'dojo/domReady': 'app/noop'
            }
    },
    ...
};

现在有问题的 domReady 回调不应再是 运行。

如果您对 map 感到好奇,可以在此 SitePen FAQ.

中阅读更多相关信息