Javascript setTimeout与元素检测外部单击之间的冲突

Javascript setTimeout与元素检测外部单击之间的冲突,javascript,jquery,settimeout,conflict,slide,Javascript,Jquery,Settimeout,Conflict,Slide,我有下面的代码。它滑入一个移动菜单,有一个超时功能,只允许在500毫秒内点击,以防止过度点击。当用户在菜单区域外单击时,它也会关闭。脚本底部的这两个函数相互冲突。只有在特殊情况下,这种情况才会发生在有响应的网站上——如果我在移动菜单仍然隐藏的情况下,在第一页加载时单击菜单区域外,然后缩小浏览器窗口,则菜单显示为已滑入 var togglerWidth = jQuery('#mobile-menu-toggler').css('min-width'); //get width of toggler

我有下面的代码。它滑入一个移动菜单,有一个超时功能,只允许在500毫秒内点击,以防止过度点击。当用户在菜单区域外单击时,它也会关闭。脚本底部的这两个函数相互冲突。只有在特殊情况下,这种情况才会发生在有响应的网站上——如果我在移动菜单仍然隐藏的情况下,在第一页加载时单击菜单区域外,然后缩小浏览器窗口,则菜单显示为已滑入

var togglerWidth = jQuery('#mobile-menu-toggler').css('min-width'); //get width of toggler

//Slide left function
var slideLeft = function () {
    var menuWidth = jQuery('#mainmenu-mobile').width(); //get width of main menu
    jQuery('#mobile-menu-toggler').animate({
        width: menuWidth
    }, // what property we are animating
    500, // how fast we are animating
    'swing', // the type of easing
    function () { // the callback    
    });

    jQuery('#mainmenu-mobile').animate({
        right: "0px"
    }, // what property we are animating
    500, // how fast we are animating
    'swing', // the type of easing
    function () { // the callback 
    });
}

//Slide Right Function
var slideRight = function () {
    var menuWidth = jQuery('#mainmenu-mobile').width(); //get width of main menu
    jQuery('#mobile-menu-toggler').animate({
        width: togglerWidth
    }, // what property we are animating
    500, // how fast we are animating
    'swing', // the type of easing
    function () { // the callback    
    });

    jQuery('#mainmenu-mobile').animate({
        right: -menuWidth
    }, // what property we are animating
    500, // how fast we are animating
    'swing', // the type of easing
    function () { // the callback     
    });
}

var activate = function () { //switch to 'active-menu' class
    jQuery('#mainmenu-mobile, #mobile-menu-toggler').addClass('active-menu');
}

var deactivate = function () { //switch back to 'inactive-menu' class
    jQuery('#mainmenu-mobile, #mobile-menu-toggler').removeClass('active-menu').addClass('inactive-menu');
}

jQuery("#mobile-menu-toggler").click(function () {
    jQuery("#mobile-menu-toggler").unbind('click');
    jQuery(this).toggleClass('inactive-menu');
    jQuery('#mainmenu-mobile').toggleClass('inactive-menu');
    jQuery("#mobile-menu-wrap").prop("disabled",true);
    if (jQuery(this).hasClass('inactive-menu')) {
        slideRight();
        deactivate();
    } else {
        slideLeft();
        activate();
    }

//*************THIS FUNCTION HAS A CONFILCT WITH THE ONE BELOW****************
setTimeout(function(){setFunction()},500); //
});

var setFunction=function(){
jQuery("#mobile-menu-toggler").bind('click',function () {
    jQuery("#mobile-menu-toggler").unbind('click');
    jQuery(this).toggleClass('inactive-menu');
    jQuery('#mainmenu-mobile').toggleClass('inactive-menu');
    jQuery("#mobile-menu-wrap").prop("disabled",true);
    if (jQuery(this).hasClass('inactive-menu')) {
        slideRight();
        deactivate();
    } else {
        slideLeft();
        activate();
    }

setTimeout(function(){setFunction()},500); //
});
}

//*************THIS FUNCTION HAS A CONFILCT WITH THE ONE ABOVE****************
jQuery(document).mouseup(function (e) {
    var container = jQuery("#mobile-menu-wrap");
    if (!container.is(e.target) && container.has(e.target).length === 0) {
        slideRight();
        deactivate();
    }
});

CODEPEN FORK:

如果我是你,我可能会这么做(只是一个例子)

为什么你要将相同的回调绑定到同一个元素?我并没有自己开发代码的这一部分。这是某人的建议。如果你能帮助重组它,我愿意接受。嗯,对我来说,这段代码运行得很好。你说的“冲突”是什么意思?它主要起作用。有一个错误-转到“代码笔”页面,确保浏览器窗口大于1024px以开始-->单击页面-->将浏览器宽度缩小到1024px以下。菜单将完全显示出来。它只应该显示切换按钮。嗯,这是我的切换按钮