单击任何网站页面上的任何位置都会导致jquery .apply错误,为什么?

Sol*_*son 8 jquery jquery-click-event stoppropagation

我发生了一些e.stopPropagation()事件,以防止点击冒出某些元素.但现在似乎每次我点击这些页面上的任何内容,除了这些元素,我在控制台中收到此错误:

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');
    }
});
Run Code Online (Sandbox Code Playgroud)

基本上,这里发生了什么,对于主菜单,我需要它保持活动/可见,直到从文档的任何位置点击.网站的几个页面上还有一个子菜单,在菜单外的任何位置点击之前也需要保持打开状态.所有这一切都正常,正如预期的那样.我看到的唯一问题是控制台中出现的错误,它开始让我死亡,因为它每次点击除ul.menu-bootstrap-menu .dropdown-menu和之外的任何元素时都会不断递增.dropdown .dropdown-toggle.所有这些代码都包含在document.ready函数调用中.

任何想法如何/为什么会发生这种情况?

我正在使用jQuery v1.11.3

以下是有关错误的图片,如果它有帮助:

控制台出错: 控制台出错

jQuery.min文件中的错误: jQuery.min文件中的错误

Eri*_*uan 1

我认为问题在这里

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);
Run Code Online (Sandbox Code Playgroud)

和这里

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

closest您正在非 jquery 对象上调用 jquery 函数eventtarget

  • @Solomon Eric 是正确的,您正在本机 DOM 对象上调用 jQuery 方法。要修复您所讨论的奇怪行为,您需要将条件语句中的 `!navtargets` 和 `!navbody` 分别更改为 `!navtargets.length` 和 `!navbody.length` 。如果您在变量上使用“console.log()”,所有这些都会很明显。但实际上,你的整个剧本似乎是一种奇怪的处理方式。如果没有合适的 [mcve],我真的无法给你一个更好的例子。 (2认同)