在javascript

时间:2015-05-20 20:18:59

标签: javascript jquery html

我目前有一个带有href属性的HTML按钮,我已经定义了一个名为“trigger-close”的id:

<a href="testimonials.html" id="trigger-cls">Testimonials</a>

在同一个HTML页面上,我有一个脚本引用一个包含按钮ID的函数:

new mlPushMenu( document.getElementById( 'mp-menu' ), document.getElementById( 'trigger-cls' ) );

在此html页面中包含的文件中是一个javascript页面,其中包含菜单系统的对象和功能。我希望“触发器关闭”使该对象执行,以便关闭菜单。这是对象。

// close the menu
    _resetMenu : function() {
        this._setTransform('translate3d(0,0,0)');
        this.level = 0;
        // remove class mp-pushed from main wrapper
        classie.remove( this.wrapper, 'mp-pushed' );
        this._toggleLevels();
        this.open = false;
    },

我相信我需要修改包含所有函数的js文件以某种方式说明如果单击“触发器关闭”然后执行_resetMenu我试图修改上述声明来说明像

if (id === 'trigger2') {
      self._resetMenu;
}

此外,我还提到了触发器cls,你可以从下面的整个摘录中看到它。

我希望这是有道理的,也是简洁的。我很感激这里的任何帮助。

我认为包含js文件的主要结构很重要,因此可以看到语法的树视图。这是它:

;( function( window ) {

'use strict';

function extend( a, b ) {
    for( var key in b ) { 
        if( b.hasOwnProperty( key ) ) {
            a[key] = b[key];
        }
    }
    return a;
}

// taken from https://github.com/inuyaksa/jquery.nicescroll/blob/master/jquery.nicescroll.js
function hasParent( e, id ) {
    if (!e) return false;
    var el = e.target||e.srcElement||e||false;
    while (el && el.id != id) {
        el = el.parentNode||false;
    }
    return (el!==false);
}

// returns the depth of the element "e" relative to element with id=id
// for this calculation only parents with classname = waypoint are considered
function getLevelDepth( e, id, waypoint, cnt ) {
    cnt = cnt || 0;
    if ( e.id.indexOf( id ) >= 0 ) return cnt;
    if( classie.has( e, waypoint ) ) {
        ++cnt;
    }
    return e.parentNode && getLevelDepth( e.parentNode, id, waypoint, cnt );
}


// returns the closest element to 'e' that has class "classname"
function closest( e, classname ) {
    if( classie.has( e, classname ) ) {
        return e;
    }
    return e.parentNode && closest( e.parentNode, classname );
}

function mlPushMenu( el, trigger, options ) {   
    this.el = el;
    this.trigger = trigger;
   this.trigger-cls = trigger-cls;
    this.options = extend( this.defaults, options );
    // support 3d transforms
    this.support = Modernizr.csstransforms3d;
    if( this.support ) {
        this._init();
    }
}


mlPushMenu.prototype = {
    defaults : {
        // overlap: there will be a gap between open levels
        // cover: the open levels will be on top of any previous open level
        type : 'overlap', // overlap || cover
        // space between each overlaped level
        levelSpacing : 40,
        // classname for the element (if any) that when clicked closes the current level
        backClass : 'mp-back'
    },
    _init : function() {
        // if menu is open or not
        this.open = false;
        // level depth
        this.level = 0;
        // the moving wrapper
        this.wrapper = document.getElementById( 'mp-pusher' );
        // the mp-level elements
        this.levels = Array.prototype.slice.call( this.el.querySelectorAll( 'div.mp-level' ) );
        // save the depth of each of these mp-level elements
        var self = this;
        this.levels.forEach( function( el, i ) { el.setAttribute( 'data-level', getLevelDepth( el, self.el.id, 'mp-level' ) ); } );
        // the menu items
        this.menuItems = Array.prototype.slice.call( this.el.querySelectorAll( 'li' ) );
        // if type == "cover" these will serve as hooks to move back to the previous level
        this.levelBack = Array.prototype.slice.call( this.el.querySelectorAll( '.' + this.options.backClass ) );
        // event type (if mobile use touch events)
        this.eventtype = mobilecheck() ? 'touchstart' : 'click';
        // add the class mp-overlap or mp-cover to the main element depending on options.type
        classie.add( this.el, 'mp-' + this.options.type );
        // initialize / bind the necessary events
        this._initEvents();
    },
    _initEvents : function() {
        var self = this;

        // the menu should close if clicking somewhere on the body
        var bodyClickFn = function( el ) {
            self._resetMenu();
            el.removeEveentListener( self.eventtype, bodyClickFn );
        };




        // open (or close) the menu
        this.trigger.addEventListener( this.eventtype, function( ev ) {
            ev.stopPropagation();
            ev.preventDefault();
            if( self.open ) {
                self._resetMenu();
            }
            else {
                self._openMenu();
                // the menu should close if clicking somewhere on the body (excluding clicks on the menu)
                document.addEventListener( self.eventtype, function( ev ) {
                    if( self.open && !hasParent( ev.target, self.el.id ) ) {
                        bodyClickFn( this );
                    }
                } );
            }
        } );

        // opening a sub level menu
        this.menuItems.forEach( function( el, i ) {
            // check if it has a sub level
            var subLevel = el.querySelector( 'div.mp-level' );
            if( subLevel ) {
                el.querySelector( 'a' ).addEventListener( self.eventtype, function( ev ) {
                    ev.preventDefault();
                    var level = closest( el, 'mp-level' ).getAttribute( 'data-level' );
                    if( self.level <= level ) {
                        ev.stopPropagation();
                        classie.add( closest( el, 'mp-level' ), 'mp-level-overlay' );
                        self._openMenu( subLevel );
                    }
                } );
            }
        } );

        // closing the sub levels :
        // by clicking on the visible part of the level element
        this.levels.forEach( function( el, i ) {
            el.addEventListener( self.eventtype, function( ev ) {
                ev.stopPropagation();
                var level = el.getAttribute( 'data-level' );
                if( self.level > level ) {
                    self.level = level;
                    self._closeMenu();
                }
            } );
        } );

        // by clicking on a specific element
        this.levelBack.forEach( function( el, i ) {
            el.addEventListener( self.eventtype, function( ev ) {
                ev.preventDefault();
                var level = closest( el, 'mp-level' ).getAttribute( 'data-level' );
                if( self.level <= level ) {
                    ev.stopPropagation();
                    self.level = closest( el, 'mp-level' ).getAttribute( 'data-level' ) - 1;
                    self.level === 0 ? self._resetMenu() : self._closeMenu();
                }
            } );
        } );    
    },
    _openMenu : function( subLevel ) {
        // increment level depth
        ++this.level;

        // move the main wrapper
        var levelFactor = ( this.level - 1 ) * this.options.levelSpacing,
            translateVal = this.options.type === 'overlap' ? this.el.offsetWidth + levelFactor : this.el.offsetWidth;

        this._setTransform( 'translate3d(' + translateVal + 'px,0,0)' );

        if( subLevel ) {
            // reset transform for sublevel
            this._setTransform( '', subLevel );
            // need to reset the translate value for the level menus that have the same level depth and are not open
            for( var i = 0, len = this.levels.length; i < len; ++i ) {
                var levelEl = this.levels[i];
                if( levelEl != subLevel && !classie.has( levelEl, 'mp-level-open' ) ) {
                    this._setTransform( 'translate3d(-100%,0,0) translate3d(' + -1*levelFactor + 'px,0,0)', levelEl );
                }
            }
        }
        // add class mp-pushed to main wrapper if opening the first time
        if( this.level === 1 ) {
            classie.add( this.wrapper, 'mp-pushed' );
            this.open = true;
        }
        // add class mp-level-open to the opening level element
        classie.add( subLevel || this.levels[0], 'mp-level-open' );
    },
    // close the menu
    _resetMenu : function() {
        this._setTransform('translate3d(0,0,0)');
        this.level = 0;
        // remove class mp-pushed from main wrapper
        classie.remove( this.wrapper, 'mp-pushed' );
        this._toggleLevels();
        this.open = false;
    },
    // close sub menus
    _closeMenu : function() {
        var translateVal = this.options.type === 'overlap' ? this.el.offsetWidth + ( this.level - 1 ) * this.options.levelSpacing : this.el.offsetWidth;
        this._setTransform( 'translate3d(' + translateVal + 'px,0,0)' );
        this._toggleLevels();
    },
    // translate the el
    _setTransform : function( val, el ) {
        el = el || this.wrapper;
        el.style.WebkitTransform = val;
        el.style.MozTransform = val;
        el.style.transform = val;
    },
    // removes classes mp-level-open from closing levels
    _toggleLevels : function() {
        for( var i = 0, len = this.levels.length; i < len; ++i ) {
            var levelEl = this.levels[i];
            if( levelEl.getAttribute( 'data-level' ) >= this.level + 1 ) {
                classie.remove( levelEl, 'mp-level-open' );
                classie.remove( levelEl, 'mp-level-overlay' );
            }
            else if( Number( levelEl.getAttribute( 'data-level' ) ) == this.level ) {
                classie.remove( levelEl, 'mp-level-overlay' );
            }
        }
    }
}

// add to global namespace
window.mlPushMenu = mlPushMenu;

} )( window );

0 个答案:

没有答案