2016-02-26 31 views
8

我有幾個e.stopPropagation()事件正在進行,以防止點擊冒出某些元素。但現在看來,每次我點擊任何東西,除了這些元素,在這些網頁上,我在控制檯收到此錯誤:點擊任何網站上的任何頁面導致jquery .apply錯誤,爲什麼?

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

我敢肯定它在這裏與stopPropagation()處理程序做,但我如何解決這個問題,我需要這些元素的stopPropagation()函數才能使這些函數在前端正常工作。

這是我目前使用的js代碼:

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'); 
    } 
}); 

基本上,這裏發生了什麼,在主菜單中,我需要它保持活躍/可見,直到點擊關閉的文檔上任意位置。在網站的幾個頁面上還有一個子菜單,它也需要保持打開狀態,直到點擊菜單外的任何地方。所有這些工作都很好,正如預期的那樣。我看到的唯一問題是控制檯中彈出的錯誤,它開始讓我死亡,因爲每次點擊ul.menu-bootstrap-menu .dropdown-menu.dropdown .dropdown-toggle以外的任何元素時,它都會不斷遞增。所有這些代碼都被封裝在一個document.ready函數調用中。

任何想法如何/爲什麼會發生這種情況?

我使用jQuery v1.11.3

以下是有關錯誤的圖像,如果它可以幫助:在控制檯

錯誤: Error in jQuery.min file

:在jQuery.min文件 Error in Console

錯誤

+0

downvoted?爲什麼? –

+0

你能提供關於錯誤的更多細節嗎?像錯誤堆棧一樣。你使用什麼jQuery版本?我沒有看到你的代碼有什麼明顯的錯誤,並且stopPropagation不應該導致這樣的錯誤......其他事情正在發生。 –

+0

@VictorLevin編輯錯誤圖像的問題,儘可能多的我可以提供的錯誤。你可以看到它指向'.stopPropagation' –

回答

2

問題在這裏我認爲

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 clicking anywhere outside of sub navs! 
    if ($('.nav-body').length) 
    { 
     var navbody = eventtarget.closest('.nav-body'); 

你非jQuery對象eventtarget上調用jQuery函數closest

+0

如果我把它變成一個jquery對象,它不適用於'navtargets'和'navbody',例如,如果我這樣做:'var eventtarget = $(e.target);'我得到的錯誤,它不按預期工作。 –

+2

@Solomon Eric是正確的,你正在調用一個本地DOM對象的jQuery方法。爲了解決你所說的奇怪行爲,你需要在你的條件語句中將'!navtargets'和'!navbody'分別改爲'!navtargets.length'和'!navbody.length'。如果你在你的變量上使用'console.log()',所有這些都會很明顯。但是,真的,你的整個劇本似乎是一個奇怪的方式去實現它。沒有一個合適的[mcve],我不能給你一個更好的例子。 –

+0

還有一個稱爲最接近的本地DOM方法:https://developer.mozilla.org/en-US/docs/Web/API/Element/closest只有IE不支持它。這就是說,看起來像OP想要的確是jq對象和方法 –

相關問題