2016-02-26 11 views
8

Ho alcuni eventi e.stopPropagation() in corso per impedire che vengano fatti clic su alcuni elementi. Ma ora sembra che ogni volta che clicco su qualsiasi cosa, oltre a questi elementi, in queste pagine, sto ottenendo questo errore nella console:Fare clic in qualsiasi punto di una pagina del sito causa l'errore jquery .apply, perché?

Uncaught TypeError: ((m.event.special[e.origType] || (intermediate value)).handle || e.handler).apply is not a function

Sono abbastanza sicuro che ha a che fare con il gestore stopPropagation() qui , ma come faccio a risolverlo esattamente, ho bisogno della funzione stopPropagation() su questi elementi affinché queste funzioni funzionino correttamente sul frontend.

Ecco il codice js che sto utilizzando attualmente:

var mainMenu = $(".menuMain"); 

if (mainMenu.length) { 
    var clonedMain = mainMenu.clone(true, true), 
     baseLogo = clonedMain.find('.logoMenu').find('.base-logo'), 
     scrollLogo = clonedMain.find('.logoMenu').find('.scroll-logo'); 

    clonedMain.addClass('scroll-menu').addClass('hidden'); 
    baseLogo.addClass('hidden'); 
    scrollLogo.removeClass('hidden'); 
} 

// Bootstrap Menu Dropdowns: 
$('ul.menu-bootstrap-menu').on('click', '.dropdown-menu', function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
    $(this).parent().siblings().removeClass('open'); 
    $(this).parent().toggleClass('open'); 
}); 

$('.dropdown').on('click', '.dropdown-toggle', function(e) { 
    e.stopPropagation(); 

    var $this = $(this); 
    var $li = $this.closest('li.dropdown'); 

    $li.siblings().removeClass('open'); 
    $li.siblings().find('a').removeClass('dropdown-overlay').children('.caret-arrow').hide(); 
    if ($li.hasClass('open')) 
    { 
     $li.removeClass('open'); 
     $this.removeClass('dropdown-overlay').children('.caret-arrow').hide(); 
    } 
    else 
    { 
     // Remove Sticky Nav search, if exists! 
     if ($('.search-scroll').length) 
      clonedMain.find('.menu-bootstrap-menu > li.search a').trigger('click'); 

     $li.addClass('open'); 
     $this.addClass('dropdown-overlay').children('.caret-arrow').show(); 
    } 
}); 

$(document).on('click', function(e) { 

    $('li.dropdown').removeClass('open'); 
    $('li.dropdown a.dropdown-toggle').removeClass('dropdown-overlay').children('.caret-arrow').hide(); 

    var eventtarget = e.target; 

    // If clicking anywhere outside of sticky nav search bar! 
    if ($('.search-scroll').length) 
    { 
     var navtargets = eventtarget.closest('li.menu-item.search'), 
      objsearch = $(eventtarget); 

     if (!navtargets && !objsearch.hasClass('search-input')) 
      clonedMain.find('.menu-bootstrap-menu > li.search a').trigger('click'); 
    } 

    // If clicking anywhere outside of sub navs! 
    if ($('.nav-body').length) 
    { 
     var navbody = eventtarget.closest('.nav-body'); 

     if (!navbody && $('.nav-body').is(':visible')) 
      $('.nav-body').slideToggle('fast'); 
    } 
}); 

In sostanza, ciò che sta accadendo qui, per il menu principale, ho bisogno di rimanere attivi/visibili finché cliccato off di qualsiasi punto del documento . C'è anche un sottomenu su alcune pagine del sito, che deve anche rimanere aperto fino a quando non viene cliccato ovunque al di fuori del menu. Tutto ciò funziona bene e come previsto. L'unico problema che sto vedendo è l'errore spuntare nella console, che sta iniziando a erigerlo a morte man mano che continua ad aumentare ogni volta che clicco su uno qualsiasi degli elementi diversi da ul.menu-bootstrap-menu .dropdown-menu e .dropdown .dropdown-toggle. Tutto questo codice è incluso in una chiamata di funzione document.ready.

Qualche idea come/perché questo sta accadendo?

Sto usando jQuery v1.11.3

Qui di seguito sono le immagini su errore, se aiuta:

errore in console: Error in Console

Errore nel file jQuery.min: Error in jQuery.min file

+0

downvoted? Perché? –

+0

Puoi fornire maggiori dettagli sull'errore? Come lo stack degli errori. Che versione di jQuery stai usando? Non vedo nulla di evidentemente sbagliato nel tuo codice e stopPropagation non dovrebbe causare un errore del genere ... Qualcos'altro sta succedendo. –

+0

@VictorLevin Domanda modificata con immagini di errore per quanto posso fornire sull'errore. Puoi vederlo puntare a '.stopPropagation' –

risposta

2

Problema qui penso

var eventtarget = e.target; 

    // If clicking anywhere outside of sticky nav search bar! 
    if ($('.search-scroll').length) 
    { 
     var navtargets = eventtarget.closest('li.menu-item.search'), 
      objsearch = $(eventtarget); 

e qui

// If clicking anywhere outside of sub navs! 
    if ($('.nav-body').length) 
    { 
     var navbody = eventtarget.closest('.nav-body'); 

Stai chiamando la funzione jquery closest su un oggetto non jquery eventtarget.

+0

Se mi rivolgo in un oggetto jQuery non funziona per '' navtargets' e navbody', per esempio, se faccio questo: var eventtarget = $ (e.target) ',' ottengo l'errore su questo e si non funziona come previsto. –

+2

@Solomon Eric è corretto, si sta chiamando un metodo jQuery su un oggetto DOM nativo. Per risolvere il comportamento strano di cui si sta parlando è necessario cambiare '! Navtargets' e'! Navbody' nelle istruzioni condizionali rispettivamente a '! Navtargets.length' e'! Navbody.length'. Tutto ciò sarebbe ovvio se si usasse 'console.log()' sulle variabili. Ma in realtà, tutta la tua sceneggiatura sembra uno strano modo di affrontarla. Senza un vero [mcve] non posso davvero darti un esempio migliore. –

+0

c'è un metodo DOM nativo chiamato più vicino troppo: https://developer.mozilla.org/en-US/docs/Web/API/Element/closest Solo IE non lo supporta. Questo è detto, sembra proprio come OP vuole infatti l'oggetto JQ & metodo –

Problemi correlati