it-swarm.com.de

nicht abgerufener Typfehler: Die Eigenschaft 'querySelectorAll' mit dem Wert null kann nicht gelesen werden

Ich versuche, dieses Menü für Handys auf einer Website zu verwenden. http://tympanus.net/codrops/2013/08/13/multi-level-Push-menu/comment-page-8/#comment-466199

Ich habe zwar funktioniert, aber ein Benutzer von ie11 meldet einen Fehler, und in der Konsole wird der folgende Fehler angezeigt: __ Uncught TypeError: Die Eigenschaft 'querySelectorAll' von nullmlPushMenu._init @ mlpushmenu.js kann nicht gelesen werden: anonyme Funktion) @ (Index): 1062

Hier ist ein Ausschnitt der betreffenden js-Datei 

function mlPushMenu( el, trigger, options ) {   
    this.el = el;
    this.trigger = trigger;
    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();
    },

die spezifische Linie 89 befindet sich in der Mitte. Hier wird sie zur Orientierung herausgezogen 

this.levels = Array.prototype.slice.call( this.el.querySelectorAll( 'div.mp-level' ) );

Ich habe dann die Instanz des Plugins in meiner Fußzeile (das ist die Indexzeile 1082) aufgerufen 

dieser Anruf sieht so aus 

<script>
    new mlPushMenu(
        document.getElementById( 'mp-menu' ),
        document.getElementById( 'trigger' ),
        { type : 'cover' }
    );
</script>
8
Tom

Ihre Desktop-Site hat kein Element mit der ID " mp-menu ". Wenn Sie die getElementById -Methode aufrufen, erhalten Sie als Antwort null. Diese wird dann der el-Eigenschaft des Objekts zugewiesen. Wenn Sie versuchen, querySelectorAll aufzurufen, versuchen Sie dies mit einem Nullwert.

Gemäß den Kommentaren zu der obigen Frage ist das Element mp-menu auf der mobilen Site alleine vorhanden. Wenn dies der Fall ist, sollte dieser Code auch nur auf dem Handy geladen werden.

10
Sampson

Das Problem war, dass die JS-Dateien auf allen Plattformen (Desktop und Mobile) aufgerufen wurden. Das mobile Menü, das das mlPushMenu verwendet, wurde nur auf mobilen Geräten aufgerufen. Dadurch, dass die JS-Dateien nur auf mobilen Geräten aufgerufen wurden, wurde das Problem für Desktop-Browser gelöst. 

0
Tom