jQuery .when().done() 不工作

2024-03-04

首先我想说我是 jQuery 的新手,我怀疑我只是做了一些愚蠢的事情,所以希望这对某人来说会很简单。

我正在尝试向我的网站添加滑动移动子菜单。我想要一种手风琴效果,如果我单击一个父链接,它的子子菜单将打开,所有其他子菜单将关闭。问题在于时间 - 子子菜单打开,然后通过重置所有子菜单再次关闭。我认为答案是使用延迟,但我尝试的一切都失败了。这是(当前不起作用)代码:

function ResetMenu(){
    jQuery(".mobile-menu").find(".sub-menu").slideUp(100);
    jQuery(".mobile-menu").find(".menu-item-has-child").removeClass("open");
};

function OpenSubmenu(){
    jQuery(this).next("ul").slideDown(100);
    jQuery(this).parent().addClass("open");
};

jQuery("li.menu-item-has-children > a").click(function(){

    if(jQuery(this).parent().hasClass("open")){
        jQuery(".mobile-menu").find(".sub-menu").slideUp(100);
        jQuery(this).parent().removeClass("open");
    } else {
        jQuery.when(ResetMenu()).done(OpenSubmenu());
    }
    return false;
});

任何帮助将不胜感激。谢谢你!

Ronel


这是如何使用时常见的错误jQuery.when().

jQuery.when()需要承诺作为论据。它没有神奇的力量来知道你传递给它的函数何时以某种方式完成。这些函数必须返回底层代码完成后已解决或拒绝的承诺,然后您可以将这些承诺传递给jQuery.when().

Your ResetMenu()函数不返回任何内容,因此,您的jQuery.when()不等待任何事情。它执行.then()立即处理程序(看起来这不是您想要的)。

所以,在这一行中:

jQuery.when(ResetMenu()).done(OpenSubmenu());

ResetMenu()必须返回一个承诺jQuery.when()知道什么时候完成。

你可以修复ResetMenu()通过这样做来以这种方式工作:

function ResetMenu(){
    return jQuery(".mobile-menu").find(".sub-menu").slideUp(100).promise().then(function() {
        // remove this class when the animation has completed
        jQuery(".mobile-menu").find(".menu-item-has-child").removeClass("open");
    });
};

然后,进一步,您需要更改将函数传递给的方式.done()对此,这两者都使其成为可以稍后执行的函数引用并绑定适当的this对它的价值:

jQuery.when(ResetMenu()).done(OpenSubmenu.bind(this));

注意,.bind(this)假设this是合适的值。您可以传递任何正确的值,这将成为this内的值OpenSubmenu()当它被执行时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jQuery .when().done() 不工作 的相关文章

随机推荐