2016-02-26 2 views
8

いくつかの要素に対してクリックがバブリングするのを防ぐため、いくつかのイベントが発生しています。私はそれがここにstopPropagation()ハンドラに関係しているかなり確信してサイトの任意のページの任意の場所をクリックすると、jquery .applyエラーが発生します。なぜですか?

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

:しかし、今では毎回私は、コンソールでこのエラーを取得しています、これらのページで、これらの要素のほかに、何をクリックしているようですしかし、これを正確に修正するには、これらの関数がフロントエンドで正しく機能するために、これらの要素にstopPropagation()関数が必要です。書類上の任意の場所のオフクリックするまで

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

基本的には、ここで何が起こっているのか、メインメニューのために、私は/アクティブ見える滞在することが必要になります。ここでは

は、私が現在使用しているjsのコードです。また、サイトのいくつかのページにサブメニューがあり、メニューの外のどこかをクリックするまで開いておく必要があります。これはすべて正常に動作し、期待通りです。私が見ている唯一の問題は、コンソールでエラーがポップアップしていることです。これは、 ul.menu-bootstrap-menu .dropdown-menu.dropdown .dropdown-toggle以外の要素をクリックするたびに増え続けるため、私を死に苦しめ始めています。このコードはすべて、 document.ready関数呼び出しでラップされています。

どのように考えていますか?どのように起こっているのですか?コンソールで

エラー: Error in jQuery.min file

:jQuery.minファイル内 Error in Console

エラーを、それは場合に役立ちます私はjQueryのv1.11.3以下

を使用しています

は、エラーに関する画像であり、

+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

nearestという名前のネイティブDOMメソッドもあります。https://developer.mozilla.org/en-US/docs/Web/API/Element/closest IEはサポートしていません。つまり、OPが実際にjqオブジェクトとメソッドを望んでいるように見えます。 –

関連する問題