我有一个示例模块,我想在不进行单独调用的情况下进行初始化,而是通过在使用者页面中具有一个数组,以便每个页面可以包含一个带有其所需模块名称的小数组。

我已经做到了,但是它没有调用模块:

var navModule = (function() {
    var nav = {};
    var navHTMLobjs = {
        navList: $('#nav'),
        listItems: $('#nav').find('li'),
        listLinks: $('#nav').find('a')
    };
    nav.bindOver = function() {
        navHTMLobjs.navList.on('mouseover mouseout', 'li a', function(e) {
            if (e.type == 'mouseover') {
                $(this).addClass('over');
            }
            if (e.type == 'mouseout') {
                $(this).removeClass('over');
            }
        });
    };
    nav.isOverBinded = function() {
        return navHTMLobjs.navList.data('events').hasOwnProperty('mouseover') && navHTMLobjs.navList.data('events').hasOwnProperty('mouseout');
    };
    nav.turnOff = function() {
        navHTMLobjs.navList.off('mouseover mouseout');
    };
    nav.isNavTurnedOff = function() {
        return !navHTMLobjs.navList.data.hasOwnProperty('events');
    };
    nav.init = function() {
        this.bindOver();
    };
    return nav;
});
//var myNav = new navModule($('#nav'));
//myNav.init();
// So I want to only include this array which will be written by
//back end and each page will only have its required bits.
var pageModules = ['navModule'];
for (var m in pageModules) {
    var fn = window[pageModules[m]];
    //var fn = Function(pageModules[m]); This says navModule is not defined :(
    if (typeof fn === 'function') {
        var inner = new fn();
        inner.init();
    }
}


当前返回fn为undefined

还请让我知道这是否是解决此问题的正确方法,如果不是建议的话。

谢谢

最佳答案

可能是我不明白这一点,但是,如果您删除了覆盖匿名函数的括号,它将不会立即被调用,并且可以通过window[pageModules[m]]进行调用

在您的情况下,函数立即调用nav.init-> nav.bindOver,它没有任何return语句,因此结果不确定

var navModule = function() {
                var nav = {};
                var navHTMLobjs = {
                    navList: $('#nav'),
                    listItems: $('#nav').find('li'),
                    listLinks: $('#nav').find('a')
                };
                nav.bindOver = function() {
                    navHTMLobjs.navList.on('mouseover mouseout', 'li a', function(e) {
                        if (e.type == 'mouseover') {
                            $(this).addClass('over');
                        }
                        if (e.type == 'mouseout') {
                            $(this).removeClass('over');
                        }
                    });
                };
                nav.isOverBinded = function() {
                    return navHTMLobjs.navList.data('events').hasOwnProperty('mouseover') && navHTMLobjs.navList.data('events').hasOwnProperty('mouseout');
                };
                nav.turnOff = function() {
                    navHTMLobjs.navList.off('mouseover mouseout');
                };
                nav.isNavTurnedOff = function() {
                    return !navHTMLobjs.navList.data.hasOwnProperty('events');
                };
                nav.init = function() {
        console.log('i am called');
                    this.bindOver();
                };
                return nav;
            };

09-25 17:03
查看更多